方法一 Java如何判断线程池所有任务是否执行完毕
2016-05-26 16:35
453 查看
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * @author nineday */ 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); } } }
上面是主线程的代码,创建了一个能同时执行50个线程的线程池,并投入5个线程,当5个线程都执行完毕后打印---“结束了!”字符串。
exe.shutdown();该方法在加入线程队列的线程执行完之前不会执行。
exe.isTerminated();当shutdown()或者shutdownNow()执行了之后才会执行,并返回true。
在上面的代码中必须有exe.isTerminated()的判断,否则在投入5个线程到线程池后会直接打印:“结束了”。不能达到我们想要的效果。
通过while(true)循环判断exe.isTerminated()重生之大文豪的值,为了防止过多的判断浪费资源,可设置线程睡眠Thread.sleep(200);
正是由于这个睡眠,所以当所有线程池中的线程都执行完后,有可能延迟200ms才执行"结束了"语句。这个参数越小延迟越小,结果越准确。
下面是子线程,子线程只是简单的将数字i打印出来;
/** * @author nineday */ public class SubThread extends Thread{ private final int i; public SubThread(int i){ this.i = i; } @Override public void run(){ System.out.println(i); } }
执行结果:
1
2
4
5
3
结束了!
子线程执行顺序不能控制,所以输出的结果是乱序的。
相关文章推荐
- Java中异常的总结
- MyEclipse8.5破解方法
- eclipse快捷键以及使用技巧大全
- springmvc注解式事务手动回滚
- Javascirpt中创建对象的几种方式
- Java发送邮件工具类
- JVM内存模型图解
- Java---静态代理VS动态代理
- Spring Security(20)——整合Cas
- SpringMVC的Interceptor
- Spring Security(19)——对Acl的支持
- java.lang.NoClassDefFoundError: org/hibernate/engine/SessionFactoryImplementor
- java责任链模式1
- Spring Security(18)——Jsp标签
- Spring Security(17)——基于方法的权限控制
- 'hibernateTemplate' must be of type [org.springframework.orm.hibernate5.HibernateTemplate]
- Spring Security(16)——基于表达式的权限控制
- 69 个经典 Spring 面试题和答案
- Java 合并word
- Spring Security(15)——权限鉴定结构