判断多线程是否全部执行完毕
2017-02-13 20:30
417 查看
在使用多线程的时候有时候我们会使用 java.util.concurrent.Executors的线程池,当多个线程异步执行的时候,我们往往不好判断是否线程池中所有的子线程都已经执行完毕,但有时候这种判断却很有用,例如我有个方法的功能是往一个文件异步地写入内容,我需要在所有的子线程写入完毕后在文件末尾写“---END---”及关闭文件流等,这个时候我就需要某个标志位可以告诉我是否线程池中所有的子线程都已经执行完毕,我使用这种方式来判断。
当调用ExecutorService.shutdown方法的时候,线程池不再接收任何新任务,但此时线程池并不会立刻退出,直到添加到线程池中的任务都已经处理完成,才会退出。在调用shutdown方法后我们可以在一个死循环里面用isTerminated方法判断是否线程池中的所有线程已经执行完毕,如果子线程都结束了,我们就可以做关闭流等后续操作了。
public class MySemaphore { public static void main(String[] args) throws IOException, InterruptedException { final File stream = new File("c:\\temp\\stonefeng\\stream.txt"); final OutputStream os = new FileOutputStream(stream); final OutputStreamWriter writer = new OutputStreamWriter(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 = new Runnable() { @Override public void run() { 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方法判断是否线程池中的所有线程已经执行完毕,如果子线程都结束了,我们就可以做关闭流等后续操作了。
相关文章推荐
- 判断线程池中的线程是否全部执行完毕
- 判断线程池中的线程是否全部执行完毕
- 判断线程池中的线程是否全部执行完毕
- 如何判断java多线程是否全部执行完了,并计算总耗时?
- 判断线程池中的线程是否全部执行完毕
- 判断线程池中的线程是否全部执行完毕
- Java 如何判断线程池所有任务是否执行完毕
- 如何判断线程池里的线程全部执行完毕
- Java如何判断线程池所有任务是否执行完毕
- Java如何判断线程池所有任务是否执行完毕
- 判断iframe是否加载完毕,在执行某方法
- Java 如何判断线程池所有任务是否执行完毕
- Java判断线程池所有任务是否执行完毕
- 多线程判断全部线程是否已经全部结束
- 判断多线程是否执行完成
- 方法一 Java如何判断线程池所有任务是否执行完毕
- Java如何判断线程池所有任务是否执行完毕
- 判断多线程是否执行完成(afterexecute
- 多线程如何判断全部线程是否已经全部结束?
- 使用 Task 替换 ThreadPool ,异步监测所有线程(任务)是否全部执行完毕