java线程池饱和策略_线程池的饱和策略-调用者执行 | 学步园
java并發編程實踐閱讀筆記之線程池的飽和策略
使用java的任務管理框架的線程池執行任務時,線程池的任務等待隊列被填滿時,飽和策略開始發揮作用。ThreadPollExecutor的飽和策略通過setRejectedExecutionHandler來修改。JDK提供了4中飽和策略如下:
AbortPolicy是默認的飽和策略,該策略會拋出未檢查異常RejectedExecutionException,調用者可以捕獲這個異常,然后根據自己的需求編寫代碼。CallerRunsPolicy則提供了一種調節機制,該策略不會拋棄任務,也不會拋出異常,而是將任務的運行回退到任務調用者,在提交任務的線程中執行該任務。下列例子中模擬了調用者運行策略,線程池初始化大小為2,等待隊列大小為2,當提交任務大于4個時,第5個任務就會在任務提交的主線程中運行。
public class MyCommand implements Runnable {
private String name;
public MyCommand(String name){
this.name = name;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" ," +
"name: "+name+","+new Date());
try {
Thread.sleep(5000);
} catch (InterruptedException execption) {
execption.printStackTrace();
}
}
}
使用調用者運行策略執行任務:
public class CallerRunTest {
private final ThreadPoolExecutor exec ;
public CallerRunTest(){
exec = new ThreadPoolExecutor(2,2,0L,TimeUnit.MICROSECONDS,
new LinkedBlockingQueue(2));
exec.setRejectedExecutionHandler(
new ThreadPoolExecutor.CallerRunsPolicy());
}
public static void main(String[] args) {
MyCommand c1 = new MyCommand("c1");
MyCommand c2 = new MyCommand("c2");
MyCommand c3 = new MyCommand("c3");
MyCommand c4 = new MyCommand("c4");
MyCommand c5 = new MyCommand("c5");
CallerRunTest c = new CallerRunTest();
c.submit(c1);
c.submit(c2);
c.submit(c3);
c.submit(c4);
c.submit(c5);
}
public void submit(Runnable command){
System.out.println(Thread.currentThread().getName()+" submit tast...");
exec.submit(command);
}
}
提交的任務打印一句任務名稱,然后休眠5秒,線程池大小為2,等待隊列大小為2 ,當第5個任務提交時,它會在主線程中執行,其他任務則都是由線程池調度運行。運行結果如下:
main submit tast...
main submit tast...
main submit tast...
main submit tast...
main submit tast...
pool-1-thread-1 ,name: c1,Mon Dec 15 15:55:02 CST 2014
main ,name: c5,Mon Dec 15 15:55:02 CST 2014
pool-1-thread-2 ,name: c2,Mon Dec 15 15:55:02 CST 2014
pool-1-thread-1 ,name: c4,Mon Dec 15 15:55:07 CST 2014
pool-1-thread-2 ,name: c3,Mon Dec 15 15:55:07 CST 2014
結論:調用者運行的飽和策略實現了一種調節機制,當工作隊列被填滿時,下一個待執行的任務會在任務提交主線程中執行,由于任務執行需要一定得時間,在任務運行期間主線程將不能再提交任務,以此可以降低任務的提交速率,為線程池正確更多的時間來完成正在排隊的任務。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的java线程池饱和策略_线程池的饱和策略-调用者执行 | 学步园的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java xml文件内容替换_java读
- 下一篇: fso 拒绝访问_java.sql.sq