在使用多线程的时候有时候我们会使用 java.util.concurrent.Executors的线程池,当多个线程异步执行的时候,我们往往不好判断是否线程池中所有的子线程都已经执行完毕,但有时候这种判断却很有用,例如我有个方法的功能是往一个文件异步地写入内容,我需要在所有的子线程写入完毕后在文件末尾写“---END---”及关闭文件流等,这个时候我就需要某个标志位可以告诉我是否线程池中所有的子线程都已经执行完毕,我使用这种方式来判断。

public classMySemaphore {

public static void main(String[] args) throwsIOException, InterruptedException {

final File stream = new File("c:\\temp\\stonefeng\\stream.txt");

final OutputStream os = newFileOutputStream(stream);

final OutputStreamWriter writer = newOutputStreamWriter(os);

final Semaphore semaphore = new Semaphore(10);

ExecutorService exec =Executors.newCachedThreadPool();

final long start =System.currentTimeMillis();

for (int i = 0; i < 10000000; i++) {

final int num =i;

Runnable task = newRunnable() {

@Override

public voidrun() {

try{

semaphore.acquire();

writer.write(String.valueOf(num)+"\n");

semaphore.release();

} catch(IOException e) {

e.printStackTrace();

} catch(InterruptedException e) {

e.printStackTrace();

}

}

};

exec.submit(task);

}

exec.shutdown();while(true){

if(exec.isTerminated()){

writer.write("---END---\n");

writer.close();

System.out.println("所有的子线程都结束了!");

break;

}

Thread.sleep(1000);

}final long end =System.currentTimeMillis();

System.out.println((end-start)/1000);

}

}

当调用ExecutorService.shutdown方法的时候,线程池不再接收任何新任务,但此时线程池并不会立刻退出,直到添加到线程池中的任务都已经处理完成,才会退出。在调用shutdown方法后我们可以在一个死循环里面用isTerminated方法判断是否线程池中的所有线程已经执行完毕,如果子线程都结束了,我们就可以做关闭流等后续操作了。

判断线程池中的线程是否全部执行完毕的另外一种解决方案则是使用闭锁(CountDownLatch)来实现,CountDownLatch是一种灵活的闭锁实现,它可以使一个或多个线程等待一组事件发生。闭锁状态包括一个计数器,该计数器被初始化为一个正数,表示需要等待的事件数量。countDown方法递减计数器,表示有一个事件已经发生了,而await方法等待计数器达到零,即表示需要等待的事情都已经发生。可以使用闭锁来这样设计程序达到目的:

1 public classCountDownLatchApproach {

2 public static void main(String[] args) throwsIOException, InterruptedException {

3 final int nThreads = 10;

4 final CountDownLatch endGate = new CountDownLatch(nThreads);5 final File stream = new File("c:\\temp\\stonefeng\\stream.txt");

6 final OutputStream os = newFileOutputStream(stream);

7 final OutputStreamWriter writer = newOutputStreamWriter(os);

8 ExecutorService exec =Executors.newCachedThreadPool();

9 for (int i = 0; i < nThreads; i++) {

10 final int num =i;

11 Runnable task = newRunnable() {

12 @Override

13 public voidrun() {

14 try{

15 writer.write(String.valueOf(num)+"\n");

16 } catch(IOException e) {

17 e.printStackTrace();

18 } finally{

19 endGate.countDown();20 }

21 }

22 };

23 exec.submit(task);

24 }

25 endGate.await();26 writer.write("---END---\n");

27 writer.close();

28 }

29 }

这种解决方案虽然可以达到目的但是性能差到没朋友,我更倾向于使用第一种方案。

现在我们有了更优雅的第三种方案,它的执行性能也不错。

1 public classMySemaphore {

2

3 public static void main(String[] args) throwsIOException, InterruptedException {

4 final File stream = new File("c:\\temp\\stonefeng\\stream.txt");

5 final OutputStream os = newFileOutputStream(stream);

6 final OutputStreamWriter writer = newOutputStreamWriter(os);

7 final Semaphore semaphore = new Semaphore(10);

8 ExecutorService exec =Executors.newCachedThreadPool();

9

10 final long start =System.currentTimeMillis();

11 for (int i = 0; i < 10000000; i++) {

12 final int num =i;

13 Runnable task = newRunnable() {

14 @Override

15 public voidrun() {

16 try{

17 semaphore.acquire();

18 writer.write(String.valueOf(num)+"\n");

19 semaphore.release();

20 } catch(IOException e) {

21 e.printStackTrace();

22 } catch(InterruptedException e) {

23 e.printStackTrace();

24 }

25 }

26 };

27 exec.submit(task);

28 }

29 exec.shutdown();

30 exec.awaitTermination(1, TimeUnit.HOURS);31 writer.write("---END---\n");

32 writer.close();

33 System.out.println("ËùÓеÄ×ÓÏ̶߳¼½áÊøÁË£¡");

34 final long end =System.currentTimeMillis();

35 System.out.println((end-start)/1000);

36 }

37 }

python 判断线程是否执行完毕_判断线程池中的线程是否全部执行完毕相关推荐

  1. 判断线程池中的线程是否全部执行完毕

    在使用多线程的时候有时候我们会使用 java.util.concurrent.Executors的线程池,当多个线程异步执行的时候,我们往往不好判断是否线程池中所有的子线程都已经执行完毕,但有时候这种 ...

  2. 判断线程池中某个线程是否执行完成

    目录 1.先写结果 2.判断某个线程是否执行完成(不使用线程池) 3.在线程池中不能使用isAlive判断线程状态的原因 3-1.错误示例 3-2.创建线程工厂 3-3.创建线程方法(ThreadPo ...

  3. winform判断线程有没有完成_并发编程系列1:线程池的架构实现、大小配置、及四种线程池使用...

    △ 公众号回复关键词"架构" 即可领取<1500+BAT架构及面试专题合集> 本篇为线程池系列文章之一,不经常使用线程池的童鞋,还有对几种线程的使用不甚了解的童鞋,可以 ...

  4. Java 线程池中的线程复用是如何实现的?

    前几天,技术群里有个群友问了一个关于线程池的问题,内容如图所示: 关于线程池相关知识可以先看下这篇:为什么阿里巴巴Java开发手册中强制要求线程池不允许使用Executors创建? 那么就来和大家探讨 ...

  5. java线程池newfi_Java 线程池中的线程复用是如何实现的?

    前几天,技术群里有个群友问了一个关于线程池的问题,内容如图所示: 那么就来和大家探讨下这个问题,在线程池中,线程会从 workQueue 中读取任务来执行,最小的执行单位就是 Worker,Worke ...

  6. Java 确定线程池中工作线程数的大小

    以问答形式展开,会更有针对性: 1.工作线程是不是越多越好? 不是.a.服务器cpu核数有限,所以同时并发或者并行的线程数是有限的,所以1核cpu设置1000个线程是没有意义的. b.线程切换也是有开 ...

  7. 一个线程池中的线程异常了,那么线程池会怎么处理这个线程?

    一个线程池中的线程异常了,那么线程池会怎么处理这个线程? 参考文章: (1)一个线程池中的线程异常了,那么线程池会怎么处理这个线程? (2)https://www.cnblogs.com/fangua ...

  8. linux下c语言线程传参数,【linux】C语言多线程中运行线程池,在线程池中运行线程池,,传递的结构体参数值为空/NULL/0...

    C语言多线程中运行线程池,在线程池中运行线程池,,传递的结构体参数值为空/NULL/0 本贴问题,之前已经提问过一次,当时已经解决了,原贴在这里https://segmentfault.com/q/1 ...

  9. python判断线程是否执行完成_判断Threading.start新线程是否执行完毕的实例

    新写自己的Threading类 class MyThread(threading.Thread):#我的Thread类 判断流程结束没 用于os shell命令是否执行判断 def __init__( ...

最新文章

  1. 用Git上传删除本地项目到gitlab---图文解析
  2. ibatis 高速缓存
  3. SpringBoot 参数符号转义,用这个包下面的类
  4. 覆盖所有面试知识点,赶紧收藏!
  5. java更新新的知识要怎么知道_晟司小蒙告诉你,Java技术知识点,不定时更新!!!...
  6. 多项式辗转相除法求最大公约数_多项式的一些性质
  7. Django nginx部署
  8. 居住证服务器维护需要多长时间,居住证正在制证要多久能拿到
  9. 《跨界杂谈》(信息)安全
  10. jquery获取所有选中的checkbook
  11. nginx80转443
  12. 校园网多拨网速叠加思路
  13. .netcf 图片区域拷贝[图片切割]
  14. PLC通讯实现-C#实现AB5000 PLC串口通讯DTL32(七)
  15. 扇贝python课程打卡_Learning by doing——百日“扇贝打卡” 历程展望
  16. Unity资源管理(四)-AssetBundle使用模式
  17. python将视频帧转化成图片时,出来的是灰色图像
  18. Gohead学习笔记
  19. matplotlib实现多个子图的盒须图
  20. feign.codec.DecodeException异常解决方案

热门文章

  1. shellcode编写
  2. Android源码中的FLAG为何使用16进制
  3. Atitit.跨语言异常转换机制 java c# php到js的异常转换
  4. SQL注入自动扫描工具中的语句
  5. 1.Python基础----认识环境
  6. linux打包java jar_在linux环境下修改可运行jar包配置并重新打包
  7. python提醒事件_监控服务器空间使用情况-crontab+python邮件提醒
  8. 苏宁大数据怎么运营_【苏宁大数据部门怎么样?进去能学到技术吗?】-看准网...
  9. socket io 不使用redis_为什么Redis单线程能够达到数十万、百万级的QPS?
  10. 正式发布python版本的年份_飞书全新版本π正式发布 高效便捷的团队沟通新工具...