我創建了一個執行緒池,并提交了兩個任務。為什么我的應用程式在列印后沒有任何例外掛起task one ,result: null???
private final static ThreadPoolExecutor executorService = new
ThreadPoolExecutor(1, 1, 1L, TimeUnit.MINUTES,
new SynchronousQueue<Runnable>(), new ThreadPoolExecutor.DiscardPolicy());
public static void main(String[] args) throws Exception {
Future taskOne = executorService.submit(() -> {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
Future taskTwo = executorService.submit(() -> System.out.println("task two is working"));;
System.out.println("task one ,result: " taskOne.get());
System.out.println("task two, result: " taskTwo.get());
executorService.shutdown();
}
uj5u.com熱心網友回復:
提交第二個任務時,觸發拒絕策略,因為執行緒池使用SynchronousQueue和maximumPoolSize為1,而第一個任務還沒有完成。您正在使用DiscardPolicy,這意味著執行緒池不執行任何操作并回傳FutureTask狀態始終為 的NEW。
public static class DiscardPolicy implements RejectedExecutionHandler {
public DiscardPolicy() { }
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
}
}
所以當你打電話時taskTwo#get(),你將永遠被阻止。(當 FutureTask 處于小于 的狀態時,它將始終被阻止COMPLETING,請參閱FutureTask#get)。
您可以使用AbortPolicy(默認策略),這樣當您執行時executorService.submit(() - > submit; System.out.println("task two is working")),您會立即獲得一個RejectedExecutionException.
或者使用Future#get(timeout),在這種情況下,TimeoutException如果在指定時間內沒有得到結果,則會得到 。
uj5u.com熱心網友回復:
new ThreadPoolExecutor.DiscardPolicy()當新任務提交失敗時,它會默默地丟棄新任務。這里 taskTwo 想要被執行,它永遠沒有機會執行。
DiscardPolicy()方法void rejectedExecution(Runnable r, ThreadPoolExecutor executor)從RejectedExecutionHandler介面內部呼叫。
我已經展示CustomRejectedExecutionHandler了更好地理解taskTwo執行緒條件。AstaskTwo被悄悄丟棄,因此該taskTwo.get()方法將永遠無法回傳資料。
這就是為什么超時需要設定為 1 秒(taskTwo.get(1000, TimeUnit.MILLISECONDS))。
package example;
import java.util.concurrent.*;
public class ThreadPoolEx {
public static void main(String[] args) {
CustomRejectedExecutionHandler rejectionHandler = new CustomRejectedExecutionHandler();
ThreadPoolExecutor executorService =
new ThreadPoolExecutor(1, 1, 1L,
TimeUnit.MINUTES,
new SynchronousQueue<Runnable>(),
rejectionHandler
);
Future taskOne = executorService.submit(() -> {
try {
System.out.println("taskOne is going to sleep");
Thread.sleep(2000);
System.out.println("taskOne is wake up");
} catch (InterruptedException e) {
e.printStackTrace();
}
});
Future taskTwo = executorService.submit(() -> System.out.println("task two is working"));
try {
System.out.println("task one ,result: " taskOne.get());
System.out.println("isTerminating " executorService.isTerminating());
System.out.println("getActiveCount " executorService.getActiveCount());
System.out.println("is cancelled " taskTwo.isCancelled());
System.out.println("is isDone " taskTwo.isDone());
System.out.println("task two, result: " taskTwo.get(1000, TimeUnit.MILLISECONDS));
} catch (Exception e) {
}
executorService.shutdown();
}
}
class CustomRejectedExecutionHandler implements RejectedExecutionHandler {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
System.out.println(r.toString() " is rejected");
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/362902.html
