來源丨blog.csdn.net/dabusiGin/article/details/105323796
在學習CallerRunsPolicy拒絕策略的時候,搜索了很多相關的知識,其他博主的描述是這樣的:
第1種:
第2種:
第3種:
第4種:JDK文檔(漢化版)
他們的描述讓我看的很懵逼,特別是第3種,仔細看他的測試代碼,并沒有用CallerRunsPolicy,而是用的AbortPolicy拒絕策略。。。。這是一篇高瀏覽量的博文,而且多人轉載。
其中上面幾種情況中寫到的“execute方法的調用線程”、“調用者線程”、“execute函數的上層線程”、“execute本身的線程”就是指的主線程,舉個例子如下圖所示,主線程就是平時執行main方法中代碼的線程。
再通過一個例子詳細說明:
class MyTask implements Runnable {
private String id;
public MyTask(String id) {
this.id = id;
}
public void run() {
System.out.println(id);
}
}
public class RejectPolicy {
public static void main(String[] args) {
ExecutorService es = new ThreadPoolExecutor(2, 2, 0L, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue《Runnable》(3), Executors.defaultThreadFactory(),
new ThreadPoolExecutor.CallerRunsPolicy());
MyTask t1 = new MyTask(“id:1”);
MyTask t2 = new MyTask(“id:2”);
MyTask t3 = new MyTask(“id:3”);
MyTask t4 = new MyTask(“id:4”);
MyTask t5 = new MyTask(“id:5”);
MyTask t6 = new MyTask(“id:6”);
MyTask t7 = new MyTask(“id:7”);
es.execute(t1);
es.execute(t2);
es.execute(t3);
es.execute(t4);
es.execute(t5);
es.execute(t6);
es.execute(t7);
}
}
這里使用主要參數是:核心線程數為2、最大線程數為2、有界隊列(容量為3)、默認線程工廠、CallerRunsPolicy拒絕策略。
運行結果如下:
id:1
id:2
id:3
id:4
id:6
id:5
id:7
可以看到所有的任務都執行了,沒有真正意義上被拒絕的。
代碼中定義了核心線程數為2的線程池,一共有7個任務要執行,其中2個任務創建線程執行去了,3個任務放入了任務隊列(workQueue)。
當提交到第6個任務的時候,會觸發拒絕策略,在這里我們配置了CallerRunsPolicy策略,主線程直接執行第六個任務去了,不再向下執行main方法中的es.execute(t7)這段代碼。
也就是說,在本程序中最多會有3個任務在執行,3個在等待。由此限制了線程池的等待任務數與執行線程數。所以JDK文檔才會說:“這提供了一個簡單的反饋控制機制,將降低新任務提交的速度”。
我的一點個人理解,希望能有助理解。
責任編輯:haq
-
處理程序
+關注
關注
0文章
3瀏覽量
5436 -
線程池
+關注
關注
0文章
57瀏覽量
6846
原文標題:大多數人不知道的:線程池CallerRunsPolicy()拒絕策略
文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論