时间:2021-05-20
我就废话不多说了,大家还是直接看代码吧~
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); } }执行结果:
3
1
4
5
2
结束了!
成功构建 (总时间: 2 秒)
子线程执行顺序不能控制,所以输出的结果是乱序的。
补充知识:java如何禁掉反射
SecurityManager
有一个checkMemberAccess这个方法可以阻止利用反射;
如:
SecurityManager sm = new SecurityManager();
sm.checkMemberAccess(Test.class, Member.PUBLIC);
前面一个为CLASS,后面需要填一个INT值,Member.PUBLIC 代表可以访问,
如果是PUBLIC,反射可以执行,DECLARED,反射运行时,会报错。
SecurityManager另外一个例子:
package com.jd.basic.pk.manager;import java.lang.reflect.Field;import java.security.Permission;public class UseReflection { static { try { System.setSecurityManager(new MySecurityManager()); } catch (SecurityException se) { System.out.println("SecurityManager already set!"); } } public static void main(String args[]) { Object prey = new Prey(); try { Field pf = prey.getClass().getDeclaredField("privateString"); pf.setAccessible(true); pf.set(prey, "Aminur test"); System.out.println(pf.get(prey)); } catch (Exception e) { System.err.println("Caught exception " + e.toString()); } }}class Prey { @SuppressWarnings("unused") private String privateString = "privateValue";}class MySecurityManager extends SecurityManager { public void checkPermission(Permission perm) { if (perm.getName().equals("suppressAccessChecks")) { throw new SecurityException("Can not change the permission dude.!"); } }}以上这篇Java 判断线程池所有任务是否执行完毕的操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Java程序有的时候在主线程中会创建多个线程去执行任务,然后在主线程执行完毕之前,把所有线程的任务进行汇总,以前可以用线程的join方法,但是这个方法不够灵
在使用多线程的时候有时候我们会使用java.util.concurrent.Executors的线程池,当多个线程异步执行的时候,我们往往不好判断是否线程池中所
在java里,我们可以使用Executors.newFixedThreadPool来创建线程池,然后就可以不停的创建新任务,并用线程池来执行了。在提交任务时,如
Java线程池ExecutorService1.线程池 1.1什么情况下使用线程池单个任务处理的时间比较短.将需处理的任务的数量大.1.2使用线程池的好处减少在
从Java5开始,Java提供了自己的线程池。线程池就是一个线程的容器,每次只执行额定数量的线程。java.util.concurrent.ThreadPool