創(chuàng)建線程的方式
只有一種澈蟆,就是 new Thread()墨辛!
即便是使用線程池,它也是這樣的趴俘。
實(shí)現(xiàn)線程的方式
- 繼承 Thread 類睹簇;
- 實(shí)現(xiàn) Runnable接口,重寫run方法【run方法無返回值】寥闪;
- 實(shí)現(xiàn) Callable 接口太惠,重寫call方法【call方法有返回值】。
線程的生命周期
那順便借一張圖橙垢,簡單復(fù)習(xí)一下操作系統(tǒng)層面線程的生命周期:
出自艿艿的博客-芋道源碼
線程池幾個(gè)參數(shù)的含義
- int corePoolSize:核心線程數(shù)垛叨,即便它們處于空閑狀態(tài)也要保留在池中的線程數(shù);
- int maximumPoolSize:池中允許的最大線程數(shù)
- long keepAliveTime:當(dāng)線程數(shù)大于核心線程數(shù)時(shí)柜某,這是多余的空閑線程將在終止之前等待新任務(wù)的最長時(shí)間嗽元;
- TimeUnit unit:keepAliveTime參數(shù)的時(shí)間單位;
- BlockingQueue<Runnable> workQueue:在執(zhí)行任務(wù)之前用于保留任務(wù)的隊(duì)列喂击。 此隊(duì)列將僅保存由 execute 方法提交的 Runnable 任務(wù)剂癌;
- ThreadFactory threadFactory:執(zhí)行程序創(chuàng)建新線程時(shí)要使用的工廠;
- RejectedExecutionHandler handler:因達(dá)到線程邊界和隊(duì)列容量而被阻止執(zhí)行時(shí)使用的處理程序翰绊;
四種拒絕策略
- AbortPolicy:拋出RejectedExecutionException異常佩谷;
- DiscardPolicy:不執(zhí)行任何操作;
- DiscardOldestPolicy:丟棄最舊的未處理請求监嗜;
- CallerRunsPolicy:在調(diào)用者線程中執(zhí)行任務(wù)谐檀。
線程池運(yùn)行過程
- 當(dāng)線程池中運(yùn)行的線程數(shù)小于 coolPoolSize 時(shí),每當(dāng)來新的任務(wù)的時(shí)候裁奇,啟動(dòng)一個(gè)線程去執(zhí)行當(dāng)前的任務(wù)桐猬;
- 當(dāng)線程池中運(yùn)行的線程數(shù)大于等于 coolPoolSize 時(shí),新來的任務(wù)將進(jìn)入阻塞隊(duì)列等待被執(zhí)行刽肠;
- 當(dāng)阻塞隊(duì)列中任務(wù)滿了的時(shí)候溃肪,將使用 maximumPoolSize 設(shè)置的值,即啟動(dòng)額外的線程來執(zhí)行新來的任務(wù)音五;
- 當(dāng)線程池中運(yùn)行的線程數(shù)大于等于 maximumPoolSize 時(shí)惫撰,啟動(dòng)拒絕策略來拒絕后續(xù)的任務(wù)。
上面只是一個(gè)大致的執(zhí)行流程躺涝,詳細(xì)的流程比上面要復(fù)雜的多厨钻,具體可以查閱 execute(Runnable command)
方法和 addWorker(Runnable firstTask, boolean core)
方法的源碼!
好了,多線程的大綱差不多就這些吧莉撇!繼續(xù)加油D馗颉!棍郎!