您的位置:首页 > 编程语言 > Java开发

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

2016-11-17 17:19 633 查看

shutdown

void shutdown()

启动一次顺序关闭,执行以前提交的任务,但不接受新任务。如果已经关闭,则调用没有其他作用。

抛出:
SecurityException
 - 如果安全管理器存在并且关闭,此 ExecutorService 可能操作某些不允许调用者修改的线程(因为它没有保持
RuntimePermission
("modifyThread")),或者安全管理器的 checkAccess 方法拒绝访问。

isTerminated

boolean isTerminated()

如果关闭后所有任务都已完成,则返回 true。注意,除非首先调用 shutdown 或 shutdownNow,否则 isTerminated 永不为 true。

返回:
如果关闭后所有任务都已完成,则返回 true

实例一:

package javatest.executorservicetest.executorservicetest1;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
* Java如何判断线程池所有任务是否执行完毕?
*
* Created by Lovell on 17/11/2016.
*/
/*
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@        @@        @@       @@@@
@@@@  @@@@@@@@  @@@@  @@  @@@   @@@
@@@@  @@@   @@  @@@@  @@  @@@@  @@@
@@@@  @@@@  @@  @@@@  @@  @@@   @@@
@@@@        @@        @@       @@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
*/

public class ExecutorServiceTest {
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()) { // 当shutdown()或者shutdownNow()执行了之后才会执行,并返回true。
System.out.println("结束了!");
break;
}
Thread.sleep(200);
}
}
}

结果:

1

2

3

4

5

结束了!

实例二:

package javatest.executorservicetest.executorsevicetest2;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
* Created by Lovell on 17/11/2016.
*/
/*
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@        @@        @@       @@@@
@@@@  @@@@@@@@  @@@@  @@  @@@   @@@
@@@@  @@@   @@  @@@@  @@  @@@@  @@@
@@@@  @@@@  @@  @@@@  @@  @@@   @@@
@@@@        @@        @@       @@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
*/

public class ExecutorServiceTest2 {

public static void moreThread() {
ExecutorService exe = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2 + 1);

try {
int threadNum = 0;
for (int i = 0; i < 10; i++) {
threadNum++;

final int currentThreadNum = threadNum;
exe.execute(new Runnable() {

@Override
public void run() {
try {
System.out.println("子线程[" + currentThreadNum + "]开启");
Thread.sleep(1000 * 10);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println("子线程[" + currentThreadNum + "]结束");
}
}
});
}
System.out.println("已经开启所有的子线程");
exe.shutdown();
System.out.println("shutdown():启动一次顺序关闭,执行以前提交的任务,但不接受新任务。");

while(true){
if(exe.isTerminated()){
System.out.println("所有的子线程都结束了!");
break;
}
Thread.sleep(1000);
}

} catch (InterruptedException e) {
e.printStackTrace();
}finally{
System.out.println("主线程结束");
}
}

public static void main(String[] args) {

moreThread();
}
}


结果:

子线程[1]开启

子线程[2]开启

子线程[3]开启

子线程[4]开启

子线程[5]开启

子线程[6]开启

子线程[7]开启

子线程[8]开启

子线程[9]开启

已经开启所有的子线程

shutdown():启动一次顺序关闭,执行以前提交的任务,但不接受新任务。

子线程[1]结束

子线程[3]结束

子线程[10]开启

子线程[2]结束

子线程[4]结束

子线程[5]结束

子线程[7]结束

子线程[8]结束

子线程[6]结束

子线程[9]结束

子线程[10]结束

所有的子线程都结束了!

主线程结束

参考:http://blog.csdn.net/truong/article/details/40227435
http://blog.csdn.net/lisheng19870305/article/details/44747741
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: