Java 線程池學習

來源:互聯網
上載者:User

Reference: 《建立Java線程池》[1],《Java線程:新特徵-線程池》[2], 《Java線程池學習》[3],《線程池ThreadPoolExecutor使用簡介》[4],《Java5中的線程池執行個體講解》[5],《ThreadPoolExecutor使用和思考》[6]

[1]中博主自己通過ThreadGroup實現一個線程池(挺方便理解的),使用的是jdk1.4版本,Jdk1.5版本以上提供了現成的線程池。

[2]中介紹了java.util.concurrent.Executors類的API。

[3]中介紹了Java中線程池的類體繫結構。

[4]中有ThreadPoolExecutor的執行個體應用。

[5]中有線程池的執行個體講解,實現了一個基於線程池的連接埠監聽伺服器。★

[6]中有對源碼比較細緻的分析,而且排版不錯( ^_^ )

 

Java裡麵線程池的頂級介面是Executor,但是嚴格意義上講Executor並不是一個線程池,而只是一個執行線程的工具。真正的線程池介面是ExecutorService。下面這張圖完整描述了線程池的類體繫結構。

 

標記一下比較重要的類:

ExecutorService: 真正的線程池介面。
ScheduledExecutorService 能和Timer/TimerTask類似,解決那些需要任務重複執行的問題。
ThreadPoolExecutor ExecutorService的預設實現。
ScheduledThreadPoolExecutor 繼承ThreadPoolExecutor的ScheduledExecutorService介面實現,週期性任務調度的類實現。

要配置一個線程池是比較複雜的,尤其是對於線程池的原理不是很清楚的情況下,很有可能配置的線程池不是較優的,因此在Executors類裡面提供了一些靜態工廠,產生一些常用的線程池。

  • newSingleThreadExecutor:建立一個單線程的線程池。這個線程池只有一個線程在工作,也就是相當於單線程串列執行所有任務。如果這個唯一的線程因為異常結束,那麼會有一個新的線程來替代它。此線程池保證所有任務的執行順序按照任務的提交順序執行。
  • newFixedThreadPool:建立固定大小的線程池。每次提交一個任務就建立一個線程,直到線程達到線程池的最大大小。線程池的大小一旦達到最大值就會保持不變,如果某個線程因為執行異常而結束,那麼線程池會補充一個新線程。
  • newCachedThreadPool:建立一個可快取的線程池。如果線程池的大小超過了處理任務所需要的線程,那麼就會回收部分空閑(60秒不執行任務)的線程,當任務數增加時,此線程池又可以智能的添加新線程來處理任務。此線程池不會對線程池大小做限制,線程池大小完全依賴於作業系統(或者說JVM)能夠建立的最大線程大小。
  • newScheduledThreadPool:建立一個大小無限的線程池。此線程池支援定時以及周期性執行任務的需求。
  • newSingleThreadExecutor:建立一個單線程的線程池。此線程池支援定時以及周期性執行任務的需求。

那我個人感覺就是new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE, KEEPALIVE_TIME, TIME_UNIT, workQueue, rejectedExecutionHandler);提供了更定製化的線程池製造方法。因為newFixedThreadPool方法其實也是return new ThreadPoolExecutor

java.util.concurrent.Executors類的API提供大量建立串連池的靜態方法:

1.固定大小的線程池:

package BackStage;
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
public class JavaThreadPool {
    public static void main(String[] args) {
// 建立一個可重用固定線程數的線程池
ExecutorService pool = Executors.newFixedThreadPool(2);
// 建立實現了Runnable介面對象,Thread對象當然也實現了Runnable介面
Thread t1 = new MyThread();
Thread t2 = new MyThread();
Thread t3 = new MyThread();
Thread t4 = new MyThread();
Thread t5 = new MyThread();
// 將線程放入池中進行執行
pool.execute(t1);
pool.execute(t2);
pool.execute(t3);
pool.execute(t4);
pool.execute(t5);
// 關閉線程池
pool.shutdown();
    }
}
class MyThread extends Thread {
    @Override
    public void run() {
System.out.println(Thread.currentThread().getName() + "正在執行。。。");
    }
}

2.單任務線程池:

//建立一個使用單個 worker 線程的 Executor,以無界隊列方式來運行該線程。 
ExecutorService pool = Executors.newSingleThreadExecutor(); 

對於以上兩種串連池,大小都是固定的,當要加入的池的線程(或者任務)超過池最大尺寸時候,則入此線程池需要排隊等待。一旦池中有線程完畢,則排隊等待的某個線程會入池執行。

[2]中還介紹了:3.可變尺寸的線程池newChahedThreadPool;4.延遲串連池;5.單任務延遲串連池;6.自訂線程池

聯繫我們

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