如何判断java多线程是否全部执行完了,并计 怎么知道java多线程都已经运行结束

java\u591a\u7ebf\u7a0b\u4e2d\uff0c\u600e\u6837\u77e5\u9053\u7ebf\u7a0b\u6267\u884c\u7ed3\u675f

\u5728\u4f60\u7684\u4e3b\u7ebf\u7a0b\u4e2d\u7528\u4e00\u4e2ajoin\u7684\u65b9\u6cd5\uff0c\u4f60\u8981\u7b49\u5f85\u8c01\uff0c\u5c31\u7528\u8c01\u8c03\u7528\uff0c\u6bd4\u5982\uff0c\u4f60\u8981\u7b49\u5f85\u7ebf\u7a0ba\u7ed3\u675f\uff0c\u5c31\u7528a.join();\u8fd9\u6837\u5c31\u53ef\u4ee5\u4e86\u3002\u8bb0\u4f4f\u54e6\uff0c\u8fd9\u6761\u8bed\u53e5\u5199\u5728\u54ea\u4e2a\u7ebf\u7a0b\u91cc\uff0c\u54ea\u4e2a\u7ebf\u7a0b\u5c31\u8981\u7b49\u5f85\u8c03\u7528\u8fd9\u4e2a\u65b9\u6cd5\u7684\u5176\u4ed6\u7ebf\u7a0b\u3002\u5c31\u662f\u8bf4\uff0c\u4f60\u5728\u4e3b\u7ebf\u7a0b\u91cc\u5199\u4e86\u8fd9\u6761\u8bed\u53e5\uff0c\u90a3\u4e48\u4e3b\u7ebf\u7a0b\u5c31\u8981\u7b49\u5f85\u7ebf\u7a0ba\u6267\u884c\u5b8c\u540e\uff0c\u4e3b\u7ebf\u7a0b\u624d\u4f1a\u6267\u884c\u3002

\u4e00\u3001\u4f7f\u7528java.util.concurrent.CountDownLatch

Java\u7684util.concurrent\u5305\u91cc\u9762\u7684CountDownLatch\u5176\u5b9e\u53ef\u4ee5\u628a\u5b83\u770b\u4f5c\u4e00\u4e2a\u8ba1\u6570\u5668\uff0c\u53ea\u4e0d\u8fc7\u8fd9\u4e2a\u8ba1\u6570\u5668\u7684\u64cd\u4f5c\u662f\u539f\u5b50\u64cd\u4f5c\uff0c\u540c\u65f6\u53ea\u80fd\u6709\u4e00\u4e2a\u7ebf\u7a0b\u53bb\u64cd\u4f5c\u8fd9\u4e2a\u8ba1\u6570\u5668\uff0c\u4e5f\u5c31\u662f\u540c\u65f6\u53ea\u80fd\u6709\u4e00\u4e2a\u7ebf\u7a0b\u53bb\u51cf\u8fd9\u4e2a\u8ba1\u6570\u5668\u91cc\u9762\u7684\u503c\u3002
\u4f60\u53ef\u4ee5\u5411CountDownLatch\u5bf9\u8c61\u8bbe\u7f6e\u4e00\u4e2a\u521d\u59cb\u7684\u6570\u5b57\u4f5c\u4e3a\u8ba1\u6570\u503c\uff0c\u4efb\u4f55\u8c03\u7528\u8fd9\u4e2a\u5bf9\u8c61\u4e0a\u7684await()\u65b9\u6cd5\u90fd\u4f1a\u963b\u585e\uff0c\u76f4\u5230\u8fd9\u4e2a\u8ba1\u6570\u5668\u7684\u8ba1\u6570\u503c\u88ab\u5176\u4ed6\u7684\u7ebf\u7a0b\u51cf\u4e3a0\u4e3a\u6b62\u3002
CountDownLatch\u7684\u4e00\u4e2a\u975e\u5e38\u5178\u578b\u7684\u5e94\u7528\u573a\u666f\u662f\uff1a\u6709\u4e00\u4e2a\u4efb\u52a1\u60f3\u8981\u5f80\u4e0b\u6267\u884c\uff0c\u4f46\u5fc5\u987b\u8981\u7b49\u5230\u5176\u4ed6\u7684\u4efb\u52a1\u6267\u884c\u5b8c\u6bd5\u540e\u624d\u53ef\u4ee5\u7ee7\u7eed\u5f80\u4e0b\u6267\u884c\u3002\u5047\u5982\u6211\u4eec\u8fd9
\u4e2a\u60f3\u8981\u7ee7\u7eed\u5f80\u4e0b\u6267\u884c\u7684\u4efb\u52a1\u8c03\u7528\u4e00\u4e2aCountDownLatch\u5bf9\u8c61\u7684await()\u65b9\u6cd5\uff0c\u5176\u4ed6\u7684\u4efb\u52a1\u6267\u884c\u5b8c\u81ea\u5df1\u7684\u4efb\u52a1\u540e\u8c03\u7528\u540c\u4e00\u4e2a
CountDownLatch\u5bf9\u8c61\u4e0a\u7684countDown()\u65b9\u6cd5\uff0c\u8fd9\u4e2a\u8c03\u7528await()\u65b9\u6cd5\u7684\u4efb\u52a1\u5c06\u4e00\u76f4\u963b\u585e\u7b49\u5f85\uff0c\u76f4\u5230\u8fd9\u4e2a
CountDownLatch\u5bf9\u8c61\u7684\u8ba1\u6570\u503c\u51cf\u52300\u4e3a\u6b62\u3002
\u4e3e\u4e2a\u4f8b\u5b50\uff0c\u6709\u4e09\u4e2a\u5de5\u4eba\u5728\u4e3a\u8001\u677f\u5e72\u6d3b\uff0c\u8fd9\u4e2a\u8001\u677f\u6709\u4e00\u4e2a\u4e60\u60ef\uff0c\u5c31\u662f\u5f53\u4e09\u4e2a\u5de5\u4eba\u628a\u4e00\u5929\u7684\u6d3b\u90fd
\u5e72\u5b8c\u4e86\u7684\u65f6\u5019\uff0c\u4ed6\u5c31\u6765\u68c0\u67e5\u6240\u6709\u5de5\u4eba\u6240\u5e72\u7684\u6d3b\u3002\u8bb0\u4f4f\u8fd9\u4e2a\u6761\u4ef6\uff1a\u4e09\u4e2a\u5de5\u4eba\u5148\u5168\u90e8\u5e72\u5b8c\u6d3b\uff0c\u8001\u677f\u624d\u68c0\u67e5\u3002\u6240\u4ee5\u5728\u8fd9\u91cc\u7528Java\u4ee3\u7801\u8bbe\u8ba1\u4e24\u4e2a\u7c7b\uff0cWorker\u4ee3\u8868\u5de5
\u4eba\uff0cBoss\u4ee3\u8868\u8001\u677f\uff0c\u5177\u4f53\u7684\u4ee3\u7801\u5b9e\u73b0\u5982\u4e0b\uff1a

Worker\u7c7b\uff08\u5355\u72ec\u7684\u7ebf\u7a0b\uff09\uff1a



package cn.edu.bupt.thread.threadnotify;

import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

public class Worker implements Runnable
{
private CountDownLatch downLatch;
private String name;

public Worker(CountDownLatch downLatch, String name)
{
this.downLatch = downLatch;
this.name = name;
}

@Override
public void run()
{
this.doWork();
try
{
TimeUnit.SECONDS.sleep(new Random().nextInt(10));
}
catch (InterruptedException ie)
{
}
System.out.println(this.name + "\u6d3b\u5e72\u5b8c\u4e86\uff01");
this.downLatch.countDown();

}

private void doWork()
{
System.out.println(this.name + "\u6b63\u5728\u5e72\u6d3b...");
}

}








Boss\u7c7b\uff08\u5355\u72ec\u7684\u7ebf\u7a0b\uff09\uff1a



package cn.edu.bupt.thread.threadnotify;

import java.util.concurrent.CountDownLatch;

public class Boss implements Runnable
{
private CountDownLatch downLatch;

public Boss(CountDownLatch downLatch)
{
this.downLatch = downLatch;
}

@Override
public void run()
{
System.out.println("\u8001\u677f\u6b63\u5728\u7b49\u6240\u6709\u7684\u5de5\u4eba\u5e72\u5b8c\u6d3b......");
try
{
this.downLatch.await();
}
catch (InterruptedException e)
{
}
System.out.println("\u5de5\u4eba\u6d3b\u90fd\u5e72\u5b8c\u4e86\uff0c\u8001\u677f\u5f00\u59cb\u68c0\u67e5\u4e86\uff01");
}

}








Main\uff1a



package cn.edu.bupt.thread.threadnotify;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CountDownLatchDemo
{
public static void main(String[] args)
{
ExecutorService executor = Executors.newCachedThreadPool();

CountDownLatch latch = new CountDownLatch(3);

Worker w1 = new Worker(latch, "\u5f20\u4e09");
Worker w2 = new Worker(latch, "\u674e\u56db");
Worker w3 = new Worker(latch, "\u738b\u4e8c");

Boss boss = new Boss(latch);

executor.execute(boss);
executor.execute(w3);
executor.execute(w2);
executor.execute(w1);

executor.shutdown();
}

}






\u4e0a\u4f8b\u4e2d\u7684\u7684ExecutorService\u63a5\u53e3\u548cExecutors\u7c7b\u7684\u4f5c\u7528\u7c7b\u4f3c\u4e8enew Thread(Runnable r).start()\u7684\u4f5c\u7528\uff0c\u5c31\u662f\u542f\u52a8\u4e00\u4e2a\u65b0\u7684\u7ebf\u7a0b\u3002

思路: 把所有的线程都放到线程池里面
步骤:
1: 创建线程池 ExecutorService cachedThreadPool
2: 开启一个线程 cachedThreadPool.execute(new Runnable() {//做任务})
3.: 判断线程池里面是否执行完, cachedThreadPool.isTerminated()
while (true) {
if (cachedThreadPool.isTerminated()) { // 计算耗时
long time = System.currentTimeMillis() - start;
System.out.println("["+Utils.getNowTime()+"]:" + "程序结束了,总耗时:" + time + " ms(毫秒)!\n");
break;
}
}

  • java濡備綍纭畾绾跨▼姹犳渶澶氱嚎绋鐨勫ぇ灏
    绛旓細鍙傛暟锛歝orePoolSize锛绾跨▼姹犵殑鍩烘湰澶у皬锛夛細褰撴彁浜や竴涓换鍔″埌绾跨▼姹犳椂锛岀嚎绋嬫睜浼氬垱寤轰竴涓嚎绋嬫潵鎵ц浠诲姟锛屽嵆浣垮叾浠栫┖闂茬殑鍩烘湰绾跨▼鑳藉鎵ц鏂颁换鍔′篃浼氬垱寤虹嚎绋嬶紝绛夊埌闇瑕佹墽琛岀殑浠诲姟鏁板ぇ浜庣嚎绋嬫睜鍩烘湰澶у皬鏃跺氨涓嶅啀鍒涘缓銆傚鏋滆皟鐢ㄤ簡绾跨▼姹犵殑prestartAllCoreThreads鏂规硶锛岀嚎绋嬫睜浼氭彁鍓嶅垱寤哄苟鍚姩鎵鏈鍩烘湰绾跨▼銆俽unnable...
  • java 澶氱嚎绋
    绛旓細绾跨▼鏄杩涚▼涓殑涓涓疄浣擄紝鏄绯荤粺鐙珛璋冨害鍜屽垎娲剧殑鍩烘湰鍗曚綅銆傜嚎绋嬭嚜宸卞熀鏈笂涓嶆嫢鏈夌郴缁熻祫婧愶紝浣嗗畠鍙互涓庡悓灞炰竴涓繘绋嬬殑鍏朵粬绾跨▼鍏变韩杩涚▼鎵鎷ユ湁鐨鍏ㄩ儴璧勬簮銆傛墍浠ョ嚎绋嬫槸杞婚噺绾х殑浠诲姟锛屽畠浠箣闂寸殑閫氫俊鍜岃浆鎹㈠彧闇瑕佽緝灏忕殑绯荤粺寮閿銆侸ava鏀寔澶氱嚎绋缂栫▼锛屽洜姝ょ敤Java缂栧啓鐨勫簲鐢ㄧ▼搴忓彲浠ュ悓鏃舵墽琛屽涓换鍔°Java鐨勫...
  • java澶氱嚎绋闂
    绛旓細绾跨▼锛鏄鎸囩▼搴忎唬鐮佺殑涓娆℃墽琛岋紝鏄姩鎬佺殑杩囩▼銆傛ゼ涓诲湪瀹氫箟OneTh杩欎釜瀹炵幇Runnable鎺ュ彛绫荤殑鏃跺欒偗瀹氬鍐欎簡浠栫殑run()鏂规硶銆俹net1鍜宱net2鏄袱涓嚎绋嬶紝涔熷氨鏄铏界劧浠栦滑鐨剅un()鏂规硶鐩稿悓锛屼絾鏄槸鎵ц浜嗕袱娆$殑銆傝绠楁満涓瑿PU鐨勮皟搴﹁繃绋嬶細鐜板湪鐨勭數鑴戠湅涓婂幓鑳藉悓鏃跺疄鐜板浠诲姟锛屽儚鏄竴杈逛笂QQ锛屼竴杈瑰惉闊充箰锛岃繕鍙互涓杈...
  • java澶氱嚎绋鏈夊嚑绉嶇姸鎬
    绛旓細鏂板缓(new)鏂板缓涓涓绾跨▼鐨勫璞°傚彲杩愯(runable)绾跨▼瀵硅薄鍒涘缓鍚庯紝鍏朵粬绾跨▼璋冪敤璇ョ嚎绋嬬殑start鏂规硶銆傛垨鑰呰绾跨▼浣嶄簬鍙繍琛岀嚎绋嬫睜涓瓑寰呰绾跨▼璋冪敤锛屽凡鑾峰彇cpu鐨勪娇鐢ㄦ潈銆傝繍琛(running)鍙繍琛岀殑绾跨▼鑾峰彇浜哻pu鐨勪娇鐢ㄦ潈锛屾墽琛岀▼搴忎唬鐮/ 闃诲(block)鐢变簬鏌愪簺鍘熷洜璇ョ嚎绋嬫斁寮冧簡cpu鐨勪娇鐢ㄦ潈銆傚仠姝㈡墽琛屻傞櫎闈炵嚎绋嬭繘鍏ュ彲...
  • JAVA澶氱嚎绋闂
    绛旓細main浼氱敓鎴愪竴涓繘绋.鎵浠ュ氨鏄涓荤嚎绋.褰撹繖涓繘绋嬫鎺夊悗鎵鏈夌殑绾跨▼閮戒細缁撴潫.鎵浠ユ槸涓昏繘绋.start鏄惎鍔ㄤ竴涓嚎绋.run鏄綘璇寸殑瀵硅薄鏂规硶璋冪敤.鏄湪涓荤嚎绋嬮噷闈㈢殑.鎵浠ュ氨鏄富绾跨▼浜.寰堢畝鍗曠殑鐞嗚В 灏辨槸main閲岄潰鐨勯兘鏄富鐨.start鍑烘潵鐨勯兘鏄瓙鐨.涓嶇浣犵殑鎵ц鍐呭鏄粈涔 ...
  • java涓澶氱嚎绋鐨勮В閲???
    绛旓細閫氬父绾跨▼鏄鍦ㄧ郴缁熷眰琚疄鐜扮殑銆java鏄涓涓湪璇█涓疄鐜扮殑銆俲ava鍦ㄨ瑷绾ф彁渚涗簡瀵澶氱嚎绋璁捐鐨勬敮鎸併傜嚎绋嬶細鏄繘绋嬩腑鐨勪竴涓崟涓鐨勮繛缁帶鍒舵祦绋嬨備竴涓繘绋嬪彲浠ユ嫢鏈夊涓嚎绋嬨傚绾跨▼甯姪浣犲啓鍑篊PU鏈澶у埄鐢ㄧ巼鐨勯珮鏁堢▼搴忋備妇渚嬫潵璇达紝缃戠粶鐨勬暟鎹紶閫侀熺巼杩滆繙浣庝簬CPU澶勭悊鑳藉姏锛屾湰鍦版枃浠剁郴缁熻祫婧愮殑璇诲啓閫熷害涔熻繙杩...
  • 鍦java涓,澶氱嚎绋鐪熺殑鏄涓嚎绋嬪悓鏃惰繍琛屽悧??
    绛旓細澶欳PU褰撶劧鏄鐪澶氱嚎绋銆傚氨鏄疌PU鍙兘鍚屾椂鍦ㄦ墽琛4涓嚎绋嬨備絾鏄笉鏄鏍镐篃娌″叧绯汇傚洜涓虹嚎绋嬬殑鎵ц寰寰浼氭寕璧凤紝绛夊緟IO涔嬬被銆傝繖鏃跺機PU浼氳浆鍒板埆鐨勭嚎绋嬫潵鎵ц銆傝繖鏄垎鏃剁郴缁熺殑涓澶х壒寰併傚綋鐒朵汉鏄劅瑙変笉鍒扮殑銆傜敤澶氱嚎绋嬶紝姣斿浣犵殑澶勭悊鍒嗕负涓ゅぇ閮ㄥ垎锛屼竴閮ㄥ垎浜х敓鏁版嵁锛屼竴閮ㄥ垎鏄剧ず鏁版嵁锛屼骇鐢熸暟鎹瘮杈冭楁椂銆傦紙鐢熶骇鑰...
  • 濡備綍瑙e喅java 澶氱嚎绋闂
    绛旓細Java璇█鎻愪緵浜嗕笓闂ㄦ満鍒朵互瑙e喅杩欑鍐茬獊锛屾湁鏁堥伩鍏嶄簡鍚屼竴涓暟鎹璞¤澶氫釜绾跨▼鍚屾椂璁块棶銆 鐢变簬鎴戜滑鍙互閫氳繃 private 鍏抽敭瀛楁潵淇濊瘉鏁版嵁瀵硅薄鍙兘琚柟娉曡闂紝鎵浠ユ垜浠彧闇閽堝鏂规硶鎻愬嚭涓濂楁満鍒讹紝杩欏鏈哄埗灏辨槸 synchronized 鍏抽敭瀛楋紝瀹冨寘鎷袱绉嶇敤娉曪細synchronized 鏂规硶鍜 synchronized 鍧椼 1锛 synchronized 鏂规硶锛...
  • 鍏充簬java澶氱嚎绋闂
    绛旓細queue.offer(0);queue.offer(1);queue.offer(2);queue.offer(3);//鎺у埗璋冪敤娆℃暟 final int count = 3;new Thread(new Runnable() { Override public void run() { int i=0;while(i<count){ / 妫娴嬮槦棣栫殑鍏冪礌鏄惁涓哄綋鍓绾跨▼闇瑕 / int index = queue.peek();if(index == 0){ System...
  • 濡備綍鍒ゆ柇涓涓郴缁鏄绾跨▼绯荤粺,杩樻槸鍗曠嚎绋嬬郴缁
    绛旓細鍦JAVA涓儚GUI銆乄EB杩欐牱鐨勯」鐩偗瀹氭槸澶氱嚎绋嬬殑銆傞櫎浜嗘垜鍒氬紑濮嬪浜java鏃跺啓鐨刪ello world锛屽氨娌¤杩囧灏戠▼搴忔槸鍗曠嚎绋嬬殑浜嗐備綘鍙互浣跨敤JAVA鑷甫鐨勫伐鍏 %JAVA_HOME%/bin/jvisualvm.exe 锛1.6+锛 鏌ョ湅浣犲惎鍔ㄧ殑JAVA搴旂敤鏄惁澶氱嚎绋銆
  • 扩展阅读:java线程池配置参数 ... java实现多线程的三种方法 ... cpu几核几线程最好 ... java多线程实例代码 ... java线程池的七个参数 ... 玩游戏要不要超线程 ... 一个初中生学java要多久 ... 为什么不建议用多线程 ... java多线程实现的四种方式 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网