Java如何判断线程池所有任务是否执行完毕

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
Java如何判断线程池所有任务是否执行完毕
给你一个例子参考下
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); } } }上面是主线程的代码,创建了一个能同时执行2个线程的线程池,并投入5个线程,当5个线程都执行完毕后打印---“结束了!”字符串。exe.shutdown();该方法在加入线程队列的线程执行完之前不会执行。exe.isTerminated();当shutdown()或者shutdownNow()执行了之后才会执行,并返回true。在上面的代码中必须有exe.isTerminated()的判断,否则在投入5个线程到线程池后会直接打印:“结束了”。不能达到我们想要的效果。通过while(true)循环判断exe.isTerminated()重生之大文豪的值,为了防止过多的判断浪费资源,可设置线程睡眠Thread.sleep(200);正是由于这个睡眠,所以当所有线程池中的线程都执行完后,有可能延迟200ms才执行"结束了"语句。这个参数越小延迟越小,结果越准确。
2015-05-24
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(3);
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);
}
}
}
上面是主线程的代码,创建了一个能同时执行2个线程的线程池,并投入5个线程,当5个线程都执行完毕后打印---“结束了!”字符串。
exe.shutdown();该方法在加入线程队列的线程执行完之前不会执行。exe.isTerminated()当shutdown()或者shutdownNow()执行了之后才会执行,并返回true。
在上面的代码中必须有exe.isTerminated()的判断,否则在投入5个线程到线程池后会直接打印:“结束了”。不能达到我们想要的效果。
通过while(true)循环判断exe.isTerminated()的值,为了防止过多的判断浪费资源,可设置线程睡眠Thread.sleep(200);正是由于这个睡眠,所以当所有线程池中的线程都执行完后,有可能延迟200ms才执行"结束了"语句。这个参数越小延迟越小,结果越准确。
下面是子线程,子线程只是简单的将数字i打印出来;
public class SubThread extends Thread{
private final int i;
public SubThread(int i){
this.i = i;
}
@Override
public void run(){
System.out.println(i);
}
}2018-08-02
mengvlog 阅读 7 次 更新于 2025-07-20 00:10:33 我来答关注问题0
  •  草原上之狼 如何判断线程池里面所有的线程执行完成

    在使用多线程的时候有时候我们会使用 java.util.concurrent.Executors的线程池,当多个线程异步执行的时候,我们往往不好判断是否线程池中所有的子线程都已经执行完毕,但有时候这种判断却很有用,例如我有个方法的功能是往一个文件异步地写入内容,我需要在所有的子线程写入完毕后在文件末尾写“---END--...

  •  幸福专卖店8888 java 如何获得线程池中正在执行的线程数?

    taskCount:线程池需要执行的任务数量。completedTaskCount:线程池在运行过程中已完成的任务数量。小于或等于taskCount。largestPoolSize:线程池曾经创建过的最大线程数量。通过这个数据可以知道线程池是否满过。如等于线程池的最大大小,则表示线程池曾经满了。getPoolSize:线程池的线程数量。如果线程池不销...

  •  翡希信息咨询 Java线程池,你五分钟讲完,而我和面试官聊了半小时

    若阻塞队列已满,再判断线程池中线程数是否达到阈值maximumPoolSize,若否,则新建一个非核心线程执行任务。若达到阈值,则执行线程池饱和策略。线程池饱和策略包括:AbortPolicy:直接抛出一个异常,为默认策略。DiscardPolicy:直接丢弃任务。DiscardOldestPolicy:抛弃下一个将要被执行的任务(最旧任务)。Calle...

  •  翡希信息咨询 Java线程池详解

    线程池的线程数 < 核心线程数:创建新线程执行任务。核心线程数 < 任务量 < 阻塞队列数:任务放入阻塞队列。阻塞队列已满,但线程池的线程数 < 最大线程数:创建新线程执行任务。阻塞队列已满,且超出最大线程数:多余的任务放入拒绝策略处理。五、阻塞队列 阻塞队列是线程池用于存放等待执行任务的队列...

  • 在实际应用中,合理设置线程池的大小是关键。如果线程池过小,可能会导致任务排队,增加响应时间;如果线程池过大,则会消耗过多资源,增加系统负担。因此,定期检查和调整线程池的配置,是优化程序性能的重要手段。总之,通过getActiveCount()等方法,可以有效地监控线程池的状态,帮助开发者做出明智的决策,...

檬味博客在线解答立即免费咨询

Java相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部