線程池的創(chuàng)建
一、線程池

首先概括一下線程池的概念,線程池相當(dāng)于一個(gè)包裝袋,袋子里有多個(gè)線程,在沒有任務(wù)時(shí),這些線程都是睡眠的,當(dāng)有任務(wù)需要執(zhí)行某個(gè)程序時(shí),會(huì)調(diào)用相應(yīng)的線程,被調(diào)用的線程會(huì)醒,執(zhí)行過后繼續(xù)睡眠。系統(tǒng)可以同時(shí)調(diào)用多個(gè)線程。
通過線程池可以啟動(dòng)多線程,Executors的工具類可以創(chuàng)建線程。線程池的有以下幾個(gè)有點(diǎn):
提高系統(tǒng)響應(yīng)速度,當(dāng)有任務(wù)時(shí),復(fù)用已存在的線程,無需等待新的線程創(chuàng)建就可以立即執(zhí)行任務(wù)
降低系統(tǒng)資源消耗,復(fù)用已存在的線程,降低了新建和銷毀線程的損耗
方便線程管控,因?yàn)榫€程如果無限制創(chuàng)建,會(huì)占用過多的內(nèi)存,并且造成cpu切換過渡
二、創(chuàng)建線程池
1.FixThreadPool(int n)固定大小的線程池
public class FixThreadPoolTest { public static void main(String[] args) { // TODO Auto-generated method stub //創(chuàng)建固定大小線程的線程池 ExecutorService ex = Executors.newFixedThreadPool(3); //用線程池執(zhí)行任務(wù) for(int i = 0;i<3;i++) { ex.submit(new Runnable() { @Override public void run() { // TODO Auto-generated method stub for(int j = 0;j<10;j++) { System.out.println(Thread.currentThread().getName()+" "+j); } } }); } // ex.submit(new Runnable() { // // @Override // public void run() { // // TODO Auto-generated method stub // for(int j = 0;j<10;j++) { // System.out.println(Thread.currentThread().getName()+" "+j); // } // } // // });只創(chuàng)建一個(gè)線程 //關(guān)閉線程池,會(huì)把原先的任務(wù)執(zhí)行完,但不會(huì)再執(zhí)行新的任務(wù) ex.shutdown(); //通過結(jié)果表明,三個(gè)線程一共要執(zhí)行5次,每個(gè)線程執(zhí)行次數(shù)是隨機(jī)的
2.SingleThreadPoolExcutor單線程池
單線程池只能創(chuàng)建一個(gè)線程,優(yōu)點(diǎn)是能夠串行執(zhí)行任務(wù),保證任務(wù)執(zhí)行順序按照任務(wù)提交順序
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class SingleThreadExecutor { public static void main(String[] args) { // TODO Auto-generated method stub ExecutorService ex = Executors.newSingleThreadExecutor(); for(int i = 0;i<5;i++) { ex.submit(new Runnable() { @Override public void run() { // TODO Auto-generated method stub for(int j = 0;j<10;j++) { System.out.println(Thread.currentThread().getName()+" "+j); } } }); } ex.shutdown(); } }
3.CashedThreadPool()緩存線程池
可以創(chuàng)建多個(gè)線程,數(shù)量不固定,線程最大值是int類型的最大值。當(dāng)沒有可用線程時(shí),可以創(chuàng)建新的線程。
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class CashedThreadPoolTest { public static void main(String[] args) { // TODO Auto-generated method stub ExecutorService ex =Executors.newCachedThreadPool(); for(int i = 0;i<5;i++) { ex.submit(new Runnable() { @Override public void run() { // TODO Auto-generated method stub for(int j = 0;j<10;j++) { System.out.println(Thread.currentThread().getName()+" "+j); } } }); } ex.shutdown(); //需要執(zhí)行5次線程任務(wù),根據(jù)結(jié)果表明,創(chuàng)建了五個(gè)線程,5個(gè)線程每個(gè)都執(zhí)行一遍for循環(huán) } }
4.newScheduledThreadPool()創(chuàng)建一個(gè)周期性的線程池,支持定時(shí)及周期性執(zhí)行任務(wù)
傳遞的是核心線程數(shù),不是固定線程數(shù)。核心線程數(shù)是線程池維護(hù)的最小線程數(shù),不會(huì)被回收
import java.util.Date; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class ScheduleThreadPoolTest { public static void main(String[] args) { // TODO Auto-generated method stub ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5); scheduledThreadPool.scheduleAtFixedRate(new Runnable() { @Override public void run() { // TODO Auto-generated method stub System.out.println(Thread.currentThread().getName()+"執(zhí)行"+new Date()); } }, 5, 3, TimeUnit.SECONDS); } }
5.newWorkStealingPool新的線程池類ForkJoinPool擴(kuò)展
JDK8之后新出的線程池類,之前的線程池類中的線程共享任務(wù)隊(duì)列。在這個(gè)線程池中,每一個(gè)下次線程都有自己的隊(duì)列,會(huì)造成CPU負(fù)載不均衡,可能有一個(gè)線程執(zhí)行的任務(wù)過重。當(dāng)線程發(fā)現(xiàn)自己沒有任務(wù)時(shí),回去其他線程中拿到任務(wù),這樣節(jié)省了執(zhí)行任務(wù)的時(shí)間
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class NewWorkStealingPoolTest { public static void main(String[] args) throws InterruptedException { // TODO Auto-generated method stub System.out.println("--start--"); ExecutorService executorService = Executors.newWorkStealingPool(); for(int i = 0;i<10;i++) { executorService.submit(new Runnable() { @Override public void run() { // TODO Auto-generated method stub for(int j = 0;j<5;j++) { System.out.println(Thread.currentThread().getName()+" "+j); } } }); } Thread.sleep(3000);//讓主線程等待3秒,等子線程執(zhí)行完任務(wù) System.out.println("--end--"); //如果一個(gè)線程分配到了一個(gè)很大的任務(wù),會(huì)把任務(wù)分成多個(gè)小任務(wù)再分配給各個(gè)線程,小任務(wù)執(zhí)行完最后把結(jié)果合并 } }
根據(jù)結(jié)果表明,每次運(yùn)行后,創(chuàng)建的線程數(shù)是不固定的,可能3個(gè)也可能4個(gè)
Java 培訓(xùn)服務(wù)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。