Android線程池(二)——ThreadPoolExecutor及其拒絕策略RejectedExecutionHandler使用樣本,threadpoolexecutor

來源:互聯網
上載者:User

Android線程池(二)——ThreadPoolExecutor及其拒絕策略RejectedExecutionHandler使用樣本,threadpoolexecutor
MainActivity如下:

package cc.vv;import java.util.concurrent.LinkedBlockingQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;import android.os.Bundle;import android.app.Activity;/** * Demo描述: * 線程池(ThreadPoolExecutor)及其拒絕策略(RejectedExecutionHandler)使用樣本 *  * 工作原理: * 線程池的工作中主要涉及到:corePoolSize,workQueue,maximumPoolSize,RejectedExecutionHandler * 它們的調用原理: * 1 當線程池中線程數量小於corePoolSize則建立線程,並處理請求 * 2 當線程池中線程數量等於corePoolSize則把請求放入workQueue中,線程池中的的空閑線程就從workQueue中取任務並處理 * 3 當workQueue已滿存放不下新入的任務時則建立線程入池,並處理請求; *   如果線程池中線程數大於maximumPoolSize則用RejectedExecutionHandler使用一定的策略來做拒絕處理 *  * 在該機制中還有一個keepAliveTime,文檔描述如下: * when the number of threads is greater than the core,  * this is the maximum time that excess idle threads will wait for new tasks before terminating. * 它是什麼意思呢? * 比如線程池中一共有5個線程,其中3個為核心線程(core)其餘兩個為非核心線程. * 當超過一定時間(keepAliveTime)非核心線程仍然閑置(即沒有執行任務或者說沒有任務可執行)那麼該非核心線程就會被終止. * 即線程池中的非核心且空閑線程所能持續的最長時間,超過該時間後該線程被終止. *  *  * RejectedExecutionHandler的四種拒絕策略 *  * hreadPoolExecutor.AbortPolicy: * 當線程池中的數量等於最大線程數時拋出java.util.concurrent.RejectedExecutionException異常. * 涉及到該異常的任務也不會被執行. *  * ThreadPoolExecutor.CallerRunsPolicy(): * 當線程池中的數量等於最大線程數時,重試添加當前的任務;它會自動重複調用execute()方法 *  * ThreadPoolExecutor.DiscardOldestPolicy(): * 當線程池中的數量等於最大線程數時,拋棄線程池中工作隊列頭部的任務(即等待時間最久Oldest的任務),並執行新傳入的任務 *  * ThreadPoolExecutor.DiscardPolicy(): * 當線程池中的數量等於最大線程數時,丟棄不能執行的新加任務 *  * 參考資料: * http://blog.csdn.net/cutesource/article/details/6061229 * http://blog.csdn.net/longeremmy/article/details/8231184 * http://blog.163.com/among_1985/blog/static/275005232012618849266/ * http://blog.csdn.net/longeremmy/article/details/8231184 * http://ifeve.com/java-threadpool/ * http://www.blogjava.net/xylz/archive/2010/07/08/325587.html * http://blog.csdn.net/ns_code/article/details/17465497 * Thank you very much *  */public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);testRejectedExecutionHandler();}// 在此分別測試四種策略,替換ThreadPoolExecutor()方法最後一個參數即可.private void testRejectedExecutionHandler() {int produceTaskMaxNumber = 10;// 構造一個線程池ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 4, 3,TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(3),new ThreadPoolExecutor.DiscardPolicy());for (int i = 1; i <= produceTaskMaxNumber; i++) {try {String task = "任務" + i;System.out.println("將" + task + "放入線程池");threadPoolExecutor.execute(new RunnableImpl(task));} catch (Exception e) {e.printStackTrace();System.out.println("AbortPolicy策略拋出異常----> " + e.toString());}}}private class RunnableImpl implements Runnable {private String taskName;private int consumerTaskSleepTime = 2000;RunnableImpl(String taskName) {this.taskName = taskName;}public void run() {System.out.println("開始 " + taskName);try {// 類比耗時任務Thread.sleep(consumerTaskSleepTime);} catch (Exception e) {e.printStackTrace();}System.out.println("完成 " + taskName);}}}

main.xml如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context=".MainActivity" >    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/hello_world" /></RelativeLayout>



對於JAVA中內建的線程池 建立問題

RejectedExecutionHandler handler: 線程池對拒絕任務的處理策略;
詳細點說:當 Executor 已經關閉,並且 Executor 將有限邊界用於最大線程和工作隊列容量,且已經飽和時,在方法 execute(java.lang.Runnable) 中提交的新任務將被拒絕。在以上兩種情況下,execute 方法都將調用其 RejectedExecutionHandler 的 RejectedExecutionHandler.rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor) 方法

一般都是直接用的new ThreadPoolExecutor.DiscardOldestPolicy()作為最後一個參數。

一般常用的handler 有四種預定義的處理常式策略:

A. 在預設的 ThreadPoolExecutor.AbortPolicy 中,處理常式遭到拒絕將拋出運行時 RejectedExecutionException 。

B. 在 ThreadPoolExecutor.CallerRunsPolicy 中,線程調用運行該任務的 execute 本身。此策略提供簡單的反饋控制機制,能夠減緩新任務的提交速度。

C. 在 ThreadPoolExecutor.DiscardPolicy 中,不能執行的任務將被刪除。

D. 在 ThreadPoolExecutor.DiscardOldestPolicy 中,如果執行程式尚未關閉,則位於工作隊列頭部的任務將被刪除,然後重試執行程式(如果再次失敗,則重複此過程)。

定義和使用其他種類的 RejectedExecutionHandler 類也是可能的,但這樣做需要非常小心,尤其是當策略僅用於特定容量或排隊策略時。
 
您好~之前教過 對於線程池建立的問題,我想教下 線程池 最大線程數量怎設定比較合理?

RejectedExecutionHandler handler: 線程池對拒絕任務的處理策略;
詳細點說:當 Executor 已經關閉,並且 Executor 將有限邊界用於最大線程和工作隊列容量,且已經飽和時,在方法 execute(java.lang.Runnable) 中提交的新任務將被拒絕。在以上兩種情況下,execute 方法都將調用其 RejectedExecutionHandler 的 RejectedExecutionHandler.rejectedExecution(java.lang.Runnable, java.util.concurrent.ThreadPoolExecutor) 方法

一般都是直接用的new ThreadPoolExecutor.DiscardOldestPolicy()作為最後一個參數。

一般常用的handler 有四種預定義的處理常式策略:

A. 在預設的 ThreadPoolExecutor.AbortPolicy 中,處理常式遭到拒絕將拋出運行時 RejectedExecutionException 。

B. 在 ThreadPoolExecutor.CallerRunsPolicy 中,線程調用運行該任務的 execute 本身。此策略提供簡單的反饋控制機制,能夠減緩新任務的提交速度。

C. 在 ThreadPoolExecutor.DiscardPolicy 中,不能執行的任務將被刪除。

D. 在 ThreadPoolExecutor.DiscardOldestPolicy 中,如果執行程式尚未關閉,則位於工作隊列頭部的任務將被刪除,然後重試執行程式(如果再次失敗,則重複此過程)。

定義和使用其他種類的 RejectedExecutionHandler 類也是可能的,但這樣做需要非常小心,尤其是當策略僅用於特定容量或排隊策略時。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.