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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java如何判断线程池所有任务是不是执行完毕相关的知识,希望对你有一定的参考价值。

可以弄个List存放所有任务,任务完成了就删掉。

大概代码如下,你可以调试看看


private ExecutorService threadPool;
private List<Callable<Boolean>> loadTasks;
private List<Future<Boolean>> loadResults;
private int numberOfTasks;

public void load() 
threadPool = Executors.newCachedThreadPool();
loadTasks = new ArrayList<Callable<Boolean>>();
//
loadTasks.add( new Callable<Boolean>() 
public Boolean call() throws Exception 
//add one task

);
//add some other tasks

loadResults = new ArrayList<Future<Boolean>>();
for( Callable<Boolean> task : loadTasks ) 
loadResults.add( threadPool.submit( task ) );

numberOfTasks = loadResults.size();


public float getLoadPercent() 
Iterator<Future<Boolean>> it = loadResults.iterator();
while (it.hasNext()) 
Future<Boolean> next = it.next();
if (next.isDone()) 
try 
if (next.get()) 
it.remove();

 catch (Exception ex) 
ex.printStackTrace();




float percent = (numberOfTasks - loadResults.size()) / (float) numberOfTasks;
return percent;

参考技术A 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);

参考技术B 打印日志,或者控制台打印,或者写程序来监听

如何判断线程池中的线程是否全部执行完毕

在使用多线程执行任务的时候,在某些场景下需要判断线程池中所有线程是否都已执行完毕,例如:我有个方法的功能是往一个文件异步地写入内容,我需要在所有的子线程写入完毕后在文件末尾写“---END---”及关闭文件流等,这个时候我就需要某个标志位可以告诉我是否线程池中所有的子线程都已经执行完毕。下面我总结了两种方式来判断。

第一种方式:使用Semaphore

Semaphore简介:

Semaphore,是JDK1.5的java.util.concurrent并发包中提供的一个并发工具类。

所谓Semaphore即 信号量 的意思。

这个叫法并不能很好地表示它的作用,更形象的说法应该是许可证管理器。

其作用在JDK注释中是这样描述的:

A counting semaphore. 
Conceptually, a semaphore maintains a set of permits. 
Each @link #acquire blocks if necessary until a permit is available, and then takes it. 
Each @link #release adds a permit, potentially releasing a blocking acquirer. 
However, no actual permit objects are used; the @code Semaphore just keeps a count of the number available and acts accordingly.

翻译过来,就是:

Semaphore是一个计数信号量。
从概念上将,Semaphore包含一组许可证。
如果有需要的话,每个acquire()方法都会阻塞,

以上是关于Java如何判断线程池所有任务是不是执行完毕的主要内容,如果未能解决你的问题,请参考以下文章

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

线程池判断是不是执行完毕

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

如何判断线程池中的线程是否全部执行完毕

如何判断线程池中的线程是否全部执行完毕

如何判断线程池中的线程是否全部执行完毕