日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java多线程-新特性-线程池

發布時間:2024/1/17 java 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java多线程-新特性-线程池 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

Sun在Java5中,對Java線程的類庫做了大量的擴展,其中線程池就是Java5的新特征之一,除了線程池之外,還有很多多線程相關的內容,為多線程的編程帶來了極大便利。為了編寫高效穩定可靠的多線程程序,線程部分的新增內容顯得尤為重要。

有關Java5線程新特征的內容全部在java.util.concurrent下面,里面包含數目眾多的接口和類,熟悉這部分API特征是一項艱難的學習過程。目前有關這方面的資料和書籍都少之又少,大部分介紹線程方面書籍還停留在java5之前的知識層面上。

在Java5之前,要實現一個線程池是相當有難度的,現在Java5為我們做好了一切,我們只需要按照提供的API來使用,即可享受線程池帶來的極大便利。

線程池的基本思想還是一種對象池的思想,開辟一塊內存空間,里面存放了眾多(未死亡)的線程,池中線程執行調度由池管理器來處理。當有線程任務時,從池中取一個,執行完成后線程對象歸池,這樣可以避免反復創建線程對象所帶來的性能開銷,節省了系統的資源。

Java5提供5種類型的線程池,分別如下:

一:newCachedThreadPool-可變尺寸的線程池(緩存線程池)?
(1)緩存型池子,先查看池中有沒有以前建立的線程,如果有,就reuse(重用),如果沒有,就建立一個新的線程加入池中;?
(2)緩存型池子,通常用于執行一些生存周期很短的異步型任務;因此一些面向連接的daemon型server中用得不多;?
(3)能reuse(重用)的線程,必須是timeout IDLE內的池中線程,缺省timeout是60s,超過這個IDLE時長,線程實例將被終止及移出池;?
(4)注意,放入CachedThreadPool的線程不必擔心其結束,超過TIMEOUT不活動,其會自動被終止。

二:newFixedThreadPool-固定大小的線程池?
(1)newFixedThreadPool與cacheThreadPool差不多,也是能reuse就用,但不能隨時建新的線程;?
(2)其獨特之處:任意時間點,最多只能有固定數目的活動線程存在,此時如果有新的線程要建立,只能放在另外的隊列中等待,直到當前的線程中某個線程終止直接被移出池子;?
(3)和cacheThreadPool不同,FixedThreadPool沒有IDLE機制(可能也有,但既然文檔沒提,肯定非常長,類似依賴上層的TCP或UDP IDLE機制之類的),所以FixedThreadPool多數針對一些很穩定很固定的正規并發線程,多用于服務器;?
(4)從方法的源代碼看,cache池和fixed池調用的是同一個底層池,只不過參數不同:
fixed池線程數固定,并且是0秒IDLE(無IDLE);
cache池線程數支持0-Integer.MAX_VALUE(顯然完全沒考慮主機的資源承受能力),60秒IDLE。

三:ScheduledThreadPool-調度線程池?
(1)調度型線程池;?
(2)這個池子里的線程可以按schedule依次delay執行,或周期執行。

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

package cn.thread;import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;/*** 線程池用法* * @author 林計欽* @version 1.0 2013-7-25 上午10:00:46*/ public class ThreadPoolTest {public static void main(String[] args) {ThreadPoolTest test=new ThreadPoolTest();//創建一個可重用固定線程數的線程池 ExecutorService pool = Executors.newFixedThreadPool(2); //創建實現了Runnable接口對象,Thread對象當然也實現了Runnable接口 Thread t1 = test.new MyThread(); Thread t2 = test.new MyThread(); Thread t3 = test.new MyThread(); Thread t4 = test.new MyThread(); Thread t5 = test.new MyThread(); //將線程放入池中進行執行 pool.execute(t1); pool.execute(t2); pool.execute(t3); pool.execute(t4); pool.execute(t5); //關閉線程池 pool.shutdown(); }class MyThread extends Thread {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "正在執行。");try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}} }

五、自定義線程池
ThreadPoolExecutor
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue)
參數:
corePoolSize?
核心線程數,核心線程會一直存活,即使沒有任務需要處理。當線程數小于核心線程數時,即使現有的線程空閑,線程池也會優先創建新線程來處理任務,而不是直接交給現有的線程處理。
核心線程在allowCoreThreadTimeout被設置為true時會超時退出,默認情況下不會退出。

maximumPoolSize
當線程數大于或等于核心線程,且任務隊列已滿時,線程池會創建新的線程,直到線程數量達到maxPoolSize。如果線程數已等于maxPoolSize,且任務隊列已滿,則已超出線程池的處理能力,線程池會拒絕處理任務而拋出異常。

keepAliveTime?
當線程空閑時間達到keepAliveTime,該線程會退出,直到線程數量等于corePoolSize。如果allowCoreThreadTimeout設置為true,則所有線程均會退出直到線程數量為0。

unit?
keepAliveTime 參數的時間單位。

workQueue?
執行前用于保持任務的隊列。此隊列僅保持由 execute 方法提交的 Runnable 任務。

拋出:
IllegalArgumentException - 如果corePoolSize或keepAliveTime小于零,或者maximumPoolSize小于或等于零,或者corePoolSize 大于maximumPoolSize。
NullPointerException - 如果workQueue為null

eg、
//創建等待隊列?
BlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(20);?
//創建一個單線程執行程序,它可安排在給定延遲后運行命令或者定期地執行。?
ThreadPoolExecutor pool = new ThreadPoolExecutor(2, 3, 2, TimeUnit.MILLISECONDS, queue);?
//創建實現了Runnable接口對象,Thread對象當然也實現了Runnable接口?
Thread t1 = new MyThread();?
Thread t2 = new MyThread();?
//將線程放入池中進行執行?
pool.execute(t1);?
pool.execute(t2);?
//關閉線程池?
pool.shutdown();

package cn.thread;import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit;/*** 自定義連接池* * @author 林計欽* @version 1.0 2013-7-25 上午10:09:17*/ public class ThreadPoolExecutorTest {public static void main(String[] args) {ThreadPoolTest test = new ThreadPoolTest();// 創建等待隊列BlockingQueue<Runnable> bqueue = new ArrayBlockingQueue<Runnable>(20);// 創建一個單線程執行程序,它可安排在給定延遲后運行命令或者定期地執行。ThreadPoolExecutor pool = new ThreadPoolExecutor(2, 3, 2, TimeUnit.MILLISECONDS, bqueue);// 創建實現了Runnable接口對象,Thread對象當然也實現了Runnable接口Thread t1 = test.new MyThread();Thread t2 = test.new MyThread();Thread t3 = test.new MyThread();Thread t4 = test.new MyThread();Thread t5 = test.new MyThread();Thread t6 = test.new MyThread();Thread t7 = test.new MyThread();// 將線程放入池中進行執行pool.execute(t1);pool.execute(t2);pool.execute(t3);pool.execute(t4);pool.execute(t5);pool.execute(t6);pool.execute(t7);// 關閉線程池pool.shutdown();}class MyThread extends Thread {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "正在執行。");try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}}

?

轉載于:https://www.cnblogs.com/dreamOfChen/p/4896385.html

總結

以上是生活随笔為你收集整理的Java多线程-新特性-线程池的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。