關於android線程池的問題

來源:互聯網
上載者:User

 ExecutorService是線程池的一個服務,可以隨時關閉線程池,是繼承Executor的。Executors是個工廠類,專門建立各種線程池。

此類支援以下各種方法:

 

       建立ExecutorService的方法 newFixedThreadPool()

      ExecutorService的方法:

    shutdown:
     void shutdown()
啟動一次順序關閉,執行以前提交的任務,但不接受新任務。如果已經關閉,則調用沒有其他作用。 

  拋出:
SecurityException - 如果安全管理器存在並且關閉,此 ExecutorService 可能操作某些不允許調用者修改的線程(因為它沒有保持 RuntimePermission("modifyThread")),或者安全管理器的checkAccess
方法拒絕訪問。

               啟動一次順序關閉,執行以前提交的任務,但不接受新任務。如果已經關閉,則調用沒有其他作用。

    awaitTermination:
    boolean awaitTermination(long timeout,                         TimeUnit unit)                         throws InterruptedException
請求關閉、發生逾時或者當前線程中斷,無論哪一個首先發生之後,都將導致阻塞,直到所有任務完成執行。 

參數:
timeout - 最長等待時間
unit - timeout 參數的時間單位
返回:
如果此執行程式終止,則返回 true;如果終止前逾時期滿,則返回 false
拋出:
InterruptedException - 如果等待時發生中
     execute:
     void execute(Runnable command)
         
在未來某個時間執行給定的命令。該命令可能在新的線程、已入池的線程或者正調用的線程中執行,這由 Executor實現決定。 

參數:
command - 可啟動並執行任務
拋出:
RejectedExecutionException - 如果不能接受執行此任務。
NullPointerException - 如果命令為 null

      

   在未來某個時間執行給定的命令。該命令可能在新的線程、已入池的線程或者正調用的線程中執行,這由 Executor 實現決定。

    submit
      Future<?> submit(Runnable task)

1. newFixedThreadPool

     1.1 是一個一開始就建立的時候,你規定好了其中的線程數字,以共用的無界隊列方式來運行這些線程。

     1.2  當池子沖的所有的線程都在完成任務的時候,新提交的任務就會處於等待。如果在關閉前的執行期間由於失敗而導致任何線程終止,那麼一個新線程將代替它執行後續  

             的任務(如果需要)。在某個線程被顯式地關閉之前,池中的線程將一直存在。 
     1.3 newFixedThreadPool 與cacheThreadPool差不多,也是能reuse就用,但不能隨時建新的線程 (因為他開始建立的時候固定好了呢)

     1.4   和cacheThreadPool不同,FixedThreadPool,-從方法的原始碼看,cache池和fixed 池調用的是同一個底層池,只不過參數不同:

        fixed池線程數固定,並且是0秒IDLE(無IDLE)
       cache池線程數支援0-Integer.MAX_VALUE 

  

   1.5代碼:

      public
static void main(String[] args)throws IOException, InterruptedException {

                 // 建立一個固定大小的線程池

           ExecutorService service = Executors.newFixedThreadPool(3);

                  for (int i = 0; i < 10; i++) {

                             System.out.println("建立線程" + i);

                                  Runnable run =
new Runnable() {

                                     
@Override public
void run() {

                                            System.out.println("啟動線程");

                                             }

                                       };

                                      // 執行給定的命令 service.execute(run);

                                 }

                                  // 關閉啟動線程 service.shutdown();

                               // 等待子線程結束,再繼續執行下面的代碼

                                service.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);

                  System.out.println("all thread complete"); }

 

          
2. newCachedThreadPool
     2.1   建立一個可根據需要建立新線程的線程池,但是在以前構造的線程可用時將重用它們。對於執行很多短期非同步任務的程式而言,這些線程池通常可提高程式效能。

     2.2   隨時建立新線程執行任務, 終止並從緩衝中移除那些已有 60 秒鐘未被使用的線程。因此,長時間保持閒置線程池不會使用任何資源。注意,可以使用

             ThreadPoolExecutor 構造方法建立具有類似屬性但細節不同(例如逾時參數)的線程池。

            -緩衝型池子,先查看池中有沒有以前建立的線程,如果有,就使用.如果沒有,就建一個新的線程加入池中

            通常用於執行一些生存期很短的非同步型任務

            放入CachedThreadPool的線程不必擔心其結束,超過TIMEOUT不活動,其會自動被終止。

 

3.  newSingleThreadExecutor  (當安全執行緒要求thread confinement,這東西比較適合)

         3.1建立一個使用單個線程的 Executor,以無界隊列方式來運行該線程。(注意,如果因為在關閉前的執行期間出現失敗而終止了此單個線程,那麼如果需要,一個新線

              程將代替它執行後續的任務)。可保證順序地執行各個任務,並且在任意給定的時間不會有多個線程是活動的。與其他等效的 newFixedThreadPool(1) 不同,可保證  

             無需重新 配置此方法所返回的執行程式即可使用其他的線程。

            -單例線程,任意時間池中只能有一個線程
            -用的是和cache池和fixed池相同的底層池,但線程數目是1-1,0秒IDLE(無IDLE)

 

4.newScheduledThreadPool (鑒於 Timer 的上述缺陷,Java 5 推出了基於線程池設計的 ScheduledExecutor。其設計思想是,每一個被調度的任務都會由線程池中一個線程  去執行,因此任務是並發執行的,相互之間不會受到幹擾。需要注意的是,只有當任務的執行時間到來時,ScheduedExecutor
才會真正啟動一個線程,其餘時間 ScheduledExecutor 都是在輪詢任務的狀態。

)
      - 調度型線程池 
      -這個池子裡的線程可以按schedule依次delay執行,或周期執行

 public class ScheduledExecutorTest implements Runnable {private String jobName = "";public ScheduledExecutorTest(String jobName) {super();this.jobName = jobName;}@Overridepublic void run() {System.out.println("execute " + jobName);}public static void main(String[] args) {ScheduledExecutorService service = Executors.newScheduledThreadPool(10);long initialDelay1 = 1;long period1 = 1;        // 從現在開始1秒鐘之後,每隔1秒鐘執行一次job1service.scheduleAtFixedRate(        new ScheduledExecutorTest("job1"), initialDelay1,period1, TimeUnit.SECONDS);long initialDelay2 = 1;long delay2 = 1;        // 從現在開始2秒鐘之後,每隔2秒鐘執行一次job2service.scheduleWithFixedDelay(        new ScheduledExecutorTest("job2"), initialDelay2,delay2, TimeUnit.SECONDS);}}Output:execute job1execute job1execute job2execute job1execute job1execute job2

 展示了 ScheduledExecutorService 中兩種最常用的調度方法 ScheduleAtFixedRate 和 ScheduleWithFixedDelay。ScheduleAtFixedRate 每次執行時間為上一次任務開始起向後推一個時間間隔,即每次執行時間為 :initialDelay, initialDelay+period, initialDelay+2*period, …;ScheduleWithFixedDelay 每次執行時間為上一次任務結束起向後推一個時間間隔,即每次執行時間為:initialDelay,
initialDelay+executeTime+delay, initialDelay+2*executeTime+2*delay。由此可見,ScheduleAtFixedRate 是基於固定時間間隔進行任務調度,ScheduleWithFixedDelay 取決於每次任務執行的時間長短,是基於不固定時間間隔進行任務調度。

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.