Java 判斷線程池所有任務是否執(zhí)行完畢的操作
我就廢話不多說了,大家還是直接看代碼吧~
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);
}
}
}
上面是主線程的代碼,創(chuàng)建了一個能同時執(zhí)行2個線程的線程池,并投入5個線程,當5個線程都執(zhí)行完畢后打印---“結束了!”字符串。
exe.shutdown();該方法在加入線程隊列的線程執(zhí)行完之前不會執(zhí)行。exe.isTerminated()當shutdown()或者shutdownNow()執(zhí)行了之后才會執(zhí)行,并返回true。
在上面的代碼中必須有exe.isTerminated()的判斷,否則在投入5個線程到線程池后會直接打印:“結束了”。不能達到我們想要的效果。
通過while(true)循環(huán)判斷exe.isTerminated()的值,為了防止過多的判斷浪費資源,可設置線程睡眠Thread.sleep(200);正是由于這個睡眠,所以當所有線程池中的線程都執(zhí)行完后,有可能延遲200ms才執(zhí)行"結束了"語句。這個參數越小延遲越小,結果越準確。
下面是子線程,子線程只是簡單的將數字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);
}
}
執(zhí)行結果:
3
1
4
5
2
結束了!
成功構建 (總時間: 2 秒)
子線程執(zhí)行順序不能控制,所以輸出的結果是亂序的。
補充知識:java如何禁掉反射
SecurityManager
有一個checkMemberAccess這個方法可以阻止利用反射;
如:
SecurityManager sm = new SecurityManager();
sm.checkMemberAccess(Test.class, Member.PUBLIC);
前面一個為CLASS,后面需要填一個INT值,Member.PUBLIC 代表可以訪問,
如果是PUBLIC,反射可以執(zhí)行,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 判斷線程池所有任務是否執(zhí)行完畢的操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java中的runnable 和 callable 區(qū)別解析
Runnable接口用于定義不需要返回結果的任務,而Callable接口可以返回結果并拋出異常,通常與Future結合使用,Runnable適用于簡單的后臺任務和定時任務,而Callable適用于并行計算、異步操作和復雜任務,選擇使用哪個接口取決于具體的應用場景,感興趣的朋友一起看看吧2025-03-03
SpringBoot請求發(fā)送與信息響應匹配實現方法介紹
這篇文章主要介紹了SpringBoot請求發(fā)送與信息響應匹配實現方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2022-10-10
Java AbstractMethodError原因案例詳解
這篇文章主要介紹了Java AbstractMethodError原因案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下2021-08-08

