Java詳解使用線程池處理任務方法_第1頁
Java詳解使用線程池處理任務方法_第2頁
Java詳解使用線程池處理任務方法_第3頁
Java詳解使用線程池處理任務方法_第4頁
Java詳解使用線程池處理任務方法_第5頁
全文預覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第Java詳解使用線程池處理任務方法不使用線程池的問題:

如果用戶每發(fā)起一個請求,后臺就創(chuàng)建一個新線程來處理,下次新任務來了又要創(chuàng)建新線程,而創(chuàng)建新線程的開銷是很大的,這樣會嚴重影響系統(tǒng)的性能。

線程池常見面試題:

1、臨時線程什么時候創(chuàng)建?

新任務提交時發(fā)現(xiàn)核心線程都在忙,任務隊列也滿了,并且還可以創(chuàng)建臨時線程,此時才會創(chuàng)建臨時線程。

2、什么時候會開始拒絕任務?

核心線程和臨時線程都在忙,任務隊列也滿了,新的任務過來的時候才會開始任務拒絕。

1、線程池處理Runnable任務

importjava.util.concurrent.*;

publicclass多線程_5線程池處理Runnable任務{(diào)

publicstaticvoidmain(String[]args){

//線程池處理Runnable任務

//創(chuàng)建線程池對象

publicThreadPoolExecutor(intcorePoolSize,//核心線程數(shù)量

intmaximumPoolSize,//線程池可支持的最大線程數(shù)量

longkeepAliveTime,//臨時線程的最大存活時間

TimeUnitunit,//指定存活時間的單位(秒,分等)

BlockingQueueRunnableworkQueue,//指定任務隊列

ThreadFactorythreadFactory,//指定用哪個線程工廠創(chuàng)建線程

RejectedExecutionHandlerhandler)//指定線程忙,任務滿了的時候,新任務來了怎么辦

ExecutorServicepool=newThreadPoolExecutor(3,5,

6,TimeUnit.SECONDS,newArrayBlockingQueue(5),

Executors.defaultThreadFactory(),newThreadPoolExecutor.AbortPolicy());

//給任務線程池處理

Runnabler=newMyExe();

//三個核心線程

pool.execute(r);

pool.execute(r);

pool.execute(r);

//五個任務隊列(不創(chuàng)建臨時線程時,會發(fā)現(xiàn)只有三個線程,即核心線程量)

pool.execute(r);

pool.execute(r);

pool.execute(r);

pool.execute(r);

pool.execute(r);

//創(chuàng)建臨時線程(五個線程,即最大線程量)

pool.execute(r);

pool.execute(r);

//不創(chuàng)建,拒絕策略被觸發(fā)

//pool.execute(r);

//關(guān)閉線程池(開發(fā)中一般不會使用)

//pool.shutdownNow();//立即關(guān)閉,即使任務沒有執(zhí)行完畢。會丟失任務的!

//pool.shutdown();//會等待任務全部執(zhí)行完畢后再關(guān)閉(建議使用)

classMyExeimplementsRunnable{

publicvoidrun(){

for(inti=1;ii++){

System.out.println(Thread.currentThread().getName()+"正在執(zhí)行:"+i+"次");

//因為當前案例任務太簡單,我們需要創(chuàng)建臨時隊列需要讓三個核心線程忙,五個任務隊列排滿,所以讓線程休眠以增加任務時間

try{

System.out.println(Thread.currentThread().getName()+"任務與線程綁定,線程進入了休眠");

Thread.sleep(1000000);

}catch(Exceptione){

e.printStackTrace();

}

2、線程池處理Callable任務

importjava.util.concurrent.*;

publicclass多線程_5線程池處理Callable任務{(diào)

publicstaticvoidmain(String[]args)throwsException{

//線程池處理Callable任務

//創(chuàng)建線程池對象

publicThreadPoolExecutor(intcorePoolSize,//核心線程數(shù)量

intmaximumPoolSize,//線程池可支持的最大線程數(shù)量

longkeepAliveTime,//臨時線程的最大存活時間

TimeUnitunit,//指定存活時間的單位(秒,分等)

BlockingQueueRunnableworkQueue,//指定任務隊列

ThreadFactorythreadFactory,//指定用哪個線程工廠創(chuàng)建線程

RejectedExecutionHandlerhandler)//指定線程忙,任務滿了的時候,新任務來了怎么辦

ExecutorServicepool=newThreadPoolExecutor(3,5,

6,TimeUnit.SECONDS,newArrayBlockingQueue(5),

Executors.defaultThreadFactory(),newThreadPoolExecutor.AbortPolicy());

//給任務線程池處理

//Callablec=newMyCallable2(100);

//pool.submit(c);

FutureStringf1=pool.submit(newMyCallable2(100));

FutureStringf2=pool.submit(newMyCallable2(200));

FutureStringf3=pool.submit(newMyCallable2(300));

FutureStringf4=pool.submit(newMyCallable2(400));

FutureStringf5=pool.submit(newMyCallable2(500));

//Stringstr=f1.get();

//System.out.println(str);

System.out.println(f1.get());

System.out.println(f2.get());

System.out.println(f3.get());

System.out.println(f4.get());

System.out.println(f5.get());

classMyCallable2implementsCallableString{

//v(泛型)

privateintn;

publicMyCallable2(intn){

this.n=n;

//重寫call方法

//案例:加法

pub

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論