java并发编程学习:如何等待多个线程执行完成 我想知道JAVA多线程中,如何让一个线程去等待N个线程执行完...

java\u5e76\u53d1\u5982\u4f55\u7b49\u5f85\u591a\u4e2a\u7ebf\u7a0b\u6267\u884c\u5b8c\u6210\u540e\u518d\u7ee7\u7eed

thread.Join\u628a\u6307\u5b9a\u7684\u7ebf\u7a0b\u52a0\u5165\u5230\u5f53\u524d\u7ebf\u7a0b\uff0c\u53ef\u4ee5\u5c06\u4e24\u4e2a\u4ea4\u66ff\u6267\u884c\u7684\u7ebf\u7a0b\u5408\u5e76\u4e3a\u987a\u5e8f\u6267\u884c\u7684\u7ebf\u7a0b\u3002\u6bd4\u5982\u5728\u7ebf\u7a0bB\u4e2d\u8c03\u7528\u4e86\u7ebf\u7a0bA\u7684Join()\u65b9\u6cd5\uff0c\u76f4\u5230\u7ebf\u7a0bA\u6267\u884c\u5b8c\u6bd5\u540e\uff0c\u624d\u4f1a\u7ee7\u7eed\u6267\u884c\u7ebf\u7a0bB\u3002

java.util.concurrent.CountDownLatch \u8fd9\u4e2a\u7c7b\u53ef\u4ee5\u5b9e\u73b0\u4f60\u6240\u8981\u7684\u529f\u80fd

\u4f8b\u5982\uff1aCountDownLatch latch = new CountDownLatch(5) //\u58f0\u660e\u8ba1\u6570\u5668\u4e3a5\u4e2a
Thread t = new Thread() {
public void run() {
try {
//TODO \u4f60\u7684\u5e94\u7528
} catch (Exception e) {
//TODO \u5f02\u5e38\u5904\u7406
}
finally {
latch.countDown(); //\u8fd9\u53e5\u662f\u5173\u952e
System.out.println("ok"); //5\u4e2a\u7ebf\u7a0b\u90fd\u8dd1\u5b8c\u540e\u8f93\u51fa
}
}
};
t.start();
\u7136\u540e\u8ba9\u4ee5\u4e0a\u64cd\u4f5c\u5faa\u73af\u4e94\u6b21(\u5c31\u662f\u8bf4\u540c\u65f6\u5f005\u4e2a\u7ebf\u7a0b)\uff0c\u90a3\u4e48\u8fd9\u4e2a"ok"\u5c31\u4f1a\u5728\u7b49\u5230\u8fd95\u4e2a\u7ebf\u7a0b\u90fdok\u540e\u624d\u4f1a\u88ab\u8f93\u51fa\u4e00\u6b21\u3002

实现方式多种多样,下面列两种供参考:

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;


public class Main {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        System.out.println("方式1");
        System.out.println("================================================");
        // 方式1
        // 创建一个线程池,并创建10个线程放入线程池执行
        ExecutorService pool = Executors.newCachedThreadPool();
        for (int i = 0; i < 10; i++) {
            pool.execute(new MyThread("线程" + i));
        }
        // 线程池不再接收新任务
        pool.shutdown();
        // 线程池中的所有线程都执行完pool.isTerminated()才返回true
        while (!pool.isTerminated()) {
            Thread.sleep(100);
        }
        System.out.println("所有线程执行完成");

        System.out.println("

方式2");
        System.out.println("================================================");

        // 方式2
        ExecutorService pool2 = Executors.newCachedThreadPool();
        List<Future> futures = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            // 使用实现Callable接口的方式创建线程,通过Future可以获取线程中返回的结果
            Future future = pool2.submit(new MyThread2("线程" + i));
            futures.add(future);
        }

        for (Future future : futures) {
            // 该方法会阻塞主线程,直到线程执行完成
            future.get();
        }
        System.out.println("所有线程执行完成");
    }

}

class MyThread extends Thread {
    private String name;

    public MyThread(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(name + "执行完成");
    }
}


class MyThread2 implements Callable {
    private String name;

    public MyThread2(String name) {
        this.name = name;
    }

    @Override
    public Object call() throws Exception {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(name + "执行完成");
        return null;
    }
}


  • 娣卞叆Java搴曞眰:鍐呭瓨灞忛殰涓嶫VM骞跺彂璇﹁В
    绛旓細鍐呭瓨灞忛殰 鍙堢О鍐呭瓨鏍呮爮 鏄竴缁勫鐞嗗櫒鎸囦护 鐢ㄤ簬瀹炵幇瀵瑰唴瀛樻搷浣滅殑椤哄簭闄愬埗 鏈枃鍋囧畾璇昏呭凡缁忓厖鍒嗘帉鎻′簡鐩稿叧姒傚康鍜Java鍐呭瓨妯″瀷 涓嶈璁哄苟鍙戜簰鏂 骞惰鏈哄埗鍜屽師瀛愭 鍐呭瓨灞忛殰鐢ㄦ潵瀹炵幇骞跺彂缂栫▼涓О涓哄彲瑙佹(visibility)鐨勫悓鏍烽噸瑕佺殑浣滅敤 鍐呭瓨灞忛殰涓轰綍閲嶈? 瀵逛富瀛樼殑涓娆¤闂竴鑸姳璐圭‖浠剁殑鏁扮櫨娆℃椂閽熷懆鏈 澶勭悊鍣ㄩ氳繃缂撳瓨(cachin...
  • Java缂栫▼瀛︿範闅句笉闅?濡備綍蹇熷叆闂↗ava
    绛旓細鍏充簬Java缂栫▼瀛︿範闅句笉闅句互鍙濡備綍蹇熷叆闂Java鐨闂锛屾垜浠彲浠ョ粰鍑轰互涓嬭В绛斻侸ava缂栫▼瀛︿範瀵逛簬鍒濆鑰呮潵璇村彲鑳戒細鏈変竴瀹氱殑鎸戞垬锛屼絾閫氳繃閫夋嫨閫傚悎鐨勫涔犳柟娉曞拰浼樿川鐨勬暀鑲叉満鏋勶紝鍍忓崈閿嬫暀鑲蹭竴鏍凤紝鍙互甯姪鎮ㄦ洿杞绘澗鍦板叆闂↗ava缂栫▼銆傛洿绯荤粺鍏ㄩ潰鐨勫涔犺祫鏂欙紝鐐瑰嚮鏌ョ湅鍦ㄥ崈閿嬫暀鑲诧紝鎴戜滑鎻愪緵鍏ㄩ潰鑰岀郴缁熺殑Java缂栫▼鍩硅璇剧▼锛...
  • java闇瑕瀛︿範鍝簺鐭ヨ瘑?瀛︿範娴佺▼鏄鎬庢牱鐨?
    绛旓細浜嬪疄涓婏紝闆嗗悎绫荤殑姒傚康鏈鏃╂槸鏉ユ簮浜庢暟鎹粨鏋勭殑锛屽洜涓鸿绠楁満閲屾湁寰堝鐗规畩鐨勬暟鎹瓨鍌ㄧ粨鏋勶紝姣斿鏂囦欢鏍戯紝姣斿閾捐〃鍜屾暟缁勭瓑缁撴瀯锛屽洜姝よ绠楁満鐞嗚鎶婅繖浜涘瓨鍌ㄦ暟鎹殑妯″瀷鎶借薄鎴愪竴浜涘父瑙佺殑缁撴瀯锛岀粺绉颁负鏁版嵁缁撴瀯銆傞偅涔堬紝Java 涓鐨骞跺彂缂栫▼鍙堟槸鍋氫粈涔堢殑鍛紝Java 涓殑澶氱嚎绋嬫槸涓轰簡鏇村ソ鍦板埄鐢ㄧ數鑴戜腑鐨凜PU鏍稿績锛岄氳繃骞跺彂缂栫▼...
  • 浠庡亸鍚戦攣鍒拌交閲忕骇閿:Java閿佺殑婕旇繘涓庢ц兘鍒嗘瀽
    绛旓細杞婚噺绾ч攣鍜岃嚜鏃嬮攣锛屽叾鏍稿績鐩爣鏄噺灏戠嚎绋嬬殑闃诲锛屼互閫傚簲澶氭牳澶勭悊鍣ㄧ殑骞跺彂闇姹傘傛湭鏉ワ紝鎴戜滑鏈熷緟Java閿佽兘鎻愪緵鏇寸伒娲荤殑绛栫暐锛屼互鏇村ソ鍦板簲瀵规棩鐩婂鏉傜殑骞跺彂鎸戞垬銆備絾鏃犺鎶鏈濡備綍鍙戝睍锛屾寔缁瀛︿範鍜屽疄璺典粛鐒舵槸鎻愬崌绋嬪簭鎬ц兘鐨勫叧閿傚湪姣忎竴娆$殑浠g爜杩唬涓紝鐞嗚В骞朵紭鍖栭攣鏈哄埗锛屾墠鑳借鎴戜滑鐨勭▼搴忓湪骞跺彂涓栫晫涓父鍒冩湁浣欍
  • java 绾跨▼姹 宸ヤ綔闃熷垪鏄濡備綍宸ヤ綔鐨
    绛旓細绾跨▼姹犲彧鏄苟鍙戠紪绋嬩腑鐨勪竴灏忛儴鍒嗭紝涓嬪浘鏄彶涓婃渶鍏ㄩ潰鐨Java鐨勫苟鍙戠紪绋嬪涔鎶鏈绘眹 3.jpg 鍏抽敭鏂规硶婧愮爜鍒嗘瀽 鎴戜滑鐪嬬湅鏍稿績鏂规硶娣诲姞鍒扮嚎绋嬫睜鏂规硶execute鐨勬簮鐮佸涓嬶細// //Executes the given task sometime in the future. The task //may execute in a new thread or in an existing pooled...
  • java浠涔堟槸骞跺彂
    绛旓細java浠涔堟槸骞跺彂锛熶竴璧锋潵鏉ヤ簡瑙d竴涓嬪惂銆傚湪Java涓锛屽悓鏃舵墽琛屽涓搷浣滅殑鈥滄濇兂鈥濈О涓哄苟鍙戯紝骞跺彂瀹屾垚鐨勬瘡涓浠朵簨绉颁负绾跨▼锛宩ava鏄竴绉嶅绾跨▼缂栫▼璇█锛屼竴鏉$嚎绋嬫寚鐨勬槸杩涚▼涓竴涓崟涓椤哄簭鐨勬帶鍒舵祦锛屼竴涓繘绋嬩腑鍙互骞跺彂澶氫釜绾跨▼锛屾瘡鏉$嚎绋嬪苟琛屾墽琛屼笉鍚岀殑浠诲姟銆傛嫇灞锛欽ava闇瑕瀛︿範浠涔堬紵1銆佸Java鏈夊熀鏈鐭ャ2...
  • Java缂栫▼璇█闇瑕瀛︿範浠涔?
    绛旓細闇瑕佺悊瑙d笉鍚岀被鍨嬬殑寮傚父浠ュ強濡備綍鎶涘嚭鍜屾崟鑾峰紓甯革紝骞剁煡閬撳湪浣曟椂浣跨敤瀹冧滑銆傛硾鍨嬶細Java娉涘瀷鏄竴绉嶄娇浣犲彲浠ュ湪缂栬瘧鏃跺畾涔夊拰妫鏌ョ被鍨嬬殑鎶鏈瀛︿範濡備綍浣跨敤娉涘瀷鍙互甯姪浣犵紪鍐欐洿瀹夊叏銆佹洿鏄撲簬鐞嗚В鐨勪唬鐮侊紝浣嗗浜庡垵瀛﹁呮潵璇达紝娉涘瀷鐨勬蹇靛拰鐢ㄦ硶鍙兘浼氭湁浜涢毦浠ョ悊瑙c骞跺彂缂栫▼锛欽ava鐨澶氱嚎绋嬪拰骞跺彂缂栫▼鍙互璁╀綘缂栧啓楂樻晥鐨...
  • Java骞跺彂缂栫▼瀹炴垬鐨勪粙缁
    绛旓細銆Java骞跺彂缂栫▼瀹炴垬銆嬫槸2012骞2鏈堟満姊板伐涓氬嚭鐗堢ぞ鍑虹増鐨勫浘涔︼紝浣滆呮槸Brian Goetz绛夈傘奐ava骞跺彂缂栫▼瀹炴垬銆嬫繁鍏ユ祬鍑哄湴浠嬬粛浜咼ava绾跨▼鍜屽苟鍙戯紝鏄竴鏈畬缇庣殑Java骞跺彂鍙傝冩墜鍐屻備功涓粠骞跺彂鎬у拰绾跨▼瀹夊叏鎬х殑鍩烘湰姒傚康鍑哄彂锛屼粙缁嶄簡濡備綍浣跨敤绫诲簱鎻愪緵鐨勫熀鏈苟鍙戞瀯寤哄潡锛岀敤浜庨伩鍏嶅苟鍙戝嵄闄┿佹瀯閫犵嚎绋嬪畨鍏ㄧ殑绫诲強楠岃瘉绾跨▼瀹夊叏...
  • Java杞欢寮鍙戣鎬庝箞瀛︿範?
    绛旓細鎯冲濂絁ava闇瑕佷綘鏈変竴瀹氱殑鑻辫鍩虹锛屽鏋滀綘鏈韩鑻辫濂介偅涔堝璧稪ava鏉ヤ細鏇村鏄撱傚鏋滀綘鑻辫寰堝樊閭d箞闇瑕佷綘鍏堝澶氱粌涔犺嫳璇紝鍥犱负Java鐨浠g爜鍙d护閮芥槸鑻辨枃鐨勶紝鎵浠ヤ綘闇瑕佸皢甯哥敤鐨勫彛浠や唬鐮佽儗鐔熴傚鏋滆嫳璇笉濂借繕涓嶆効鎰忔璁扮‖鑳岋紝閭d箞鐢Java缂栫▼閮芥槸涓棶棰樸傚叾娆¢浂鍩虹瀛︿範Java鎯冲叆闂ㄩ鍏堣瀛︿範涓浜汮avaEE鍩虹鐭ヨ瘑...
  • Java缂栫▼璇█闇瑕瀛︿範浠涔?
    绛旓細5. IO涓庢枃浠舵搷浣滐細瀛︿範杈撳叆杈撳嚭娴佺殑浣跨敤锛屽寘鎷枃浠惰鍐欍佺綉缁滈氫俊绛夈備簡瑙Java鐨IO鏈哄埗锛岃兘澶熻繘琛屾枃浠舵搷浣滃拰鏁版嵁浼犺緭銆6. 澶氱嚎绋缂栫▼锛氬涔澶氱嚎绋嬬紪绋嬬殑鍩烘湰姒傚康鍜屾妧宸э紝鍖呮嫭绾跨▼鐨勫垱寤恒佸悓姝ヤ笌浜掓枼銆佺嚎绋嬫睜绛夈傛帉鎻″绾跨▼缂栫▼鍙互鎻愰珮绋嬪簭鐨骞跺彂鎬ц兘銆7. 鏁版嵁搴撶紪绋嬶細瀛︿範浣跨敤Java杩涜鏁版嵁搴撴搷浣滐紝鍖呮嫭杩炴帴...
  • 本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网