方法1:通过Thread类中的isAlive()方法判断线程是否处于活动状态。

线程启动后,只要没有运行完毕,都会返回true。

【注】如果只是要等其他线程运行结束之后再继续操作,可以执行t.join(),即:在t执行完毕前挂起。

方法2:通过Thread.activeCount()方法判断当前线程的线程组中活动线程的数目,为1时其他线程运行完毕。

方法3:通过java.util.concurrent.Executors中的方法创建一个线程池,用这个线程池来启动线程。启动所有要启动的线程后,执行线程池的shutdown()方法,即在所有线程执行完毕后关闭线程池。然后通过线程池的isTerminated()方法,判断线程池是否已经关闭。线程池成功关闭,就意味着所有线程已经运行完毕了。

示例代码:

 import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class Test { public static void main(String args[]) throws InterruptedException {
ExecutorService exe = Executors.newFixedThreadPool(50);
for (int i = 1; i <= 5; i++) {
exe.execute(new SubThread(i));
}
exe.shutdown();
while (true) {
if (exe.isTerminated()) {
System.out.println("结束了!");
break;
}
Thread.sleep(200);
}
}
}

一个思路:

给所有的线程加上同步(同一个锁),主线程在启动其他所有线程后wait()。每个线程运行结束后,执行notify()方法。设定一个值为其他线程数量的int计数器count,写一个while循环,循环条件为count-->0,循环内容为wait()。则所有线程运行结束后正好while循环结束。

致命缺陷:如果几个线程同时运行结束,有可能在主线程还没运行时,已经执行了好几次notify()方法。如果这样的话,while循环就永远不会结束了,主线程一直wait()下去。

一个思路

最新文章

  1. 游戏服务器菜鸟之C#初探三游戏服务
  2. JQ图片轮播
  3. git备份sublime插件及配置
  4. windows7下安装php的imagick和imagemagick扩展教程
  5. Java 文件和byte数组转换
  6. C#--GDI+的LinearGradientBrush类
  7. (转)HelloWorld CMake CMake中构建静态库与动态库及其使用
  8. 【Android】-- adb shell 命令探索
  9. Mac之OS系统下搭建JavaEE环境 &lt;三&gt; 之Eclipse 与 IntelliJ IDEA 的安装配置
  10. iOS开发之线程间的MachPort通信与子线程中的Notification转发
  11. kafka安装使用和遇到的坑
  12. 谈谈java虚拟机
  13. 移动端rem适配
  14. AI 奇异值分解(SVD)
  15. QRegExp 正则表达式详解
  16. 用C#中的键值对遍历数组或字符串元素的次数
  17. POJ3186(KB12-O DP)
  18. iOS必学技-cocoapods
  19. Linux pyenv环境安装
  20. 洛谷P3538 [POI2012]OKR-A Horrible Poem [字符串hash]

热门文章

  1. js—双等号引起的类型转换过程
  2. JavaSE基础篇—MySQL基础知识点
  3. FastDFS角色配置参数思维导图
  4. C语言预处理 编译 汇编 链接四个阶段
  5. python之作业--------购物车优化
  6. 针对Chrome谷歌等浏览器不再支持showModalDialog的解决方案
  7. Oracle 12cR1 RAC 在VMware Workstation上安装(中)—图形界面安装
  8. BZOJ 4538: [Hnoi2016]网络 [整体二分]
  9. Android开发常用的插件及工具
  10. SaltStack 的远程执行机制