您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)Java怎么固定大小的線程池的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
線程池就是在程序啟動的時候先建立幾個可以使用的線程放在那里,然后等著具體的任務(wù)放進去,這個任務(wù)基本可以說都是Runnable的實現(xiàn)類,因此它減小了系統(tǒng)每次新建和銷毀線程的開銷,但同時增加了維護這些線程的開銷,個中取舍看具體情況而定。
固定大小的線程池就是在啟動的時候創(chuàng)建了固定個數(shù)的線程放在那里等待使用。
public class TaskPool{ private final ThreadPoolExecutor executor = (ThreadPoolExecutor)Executors.newFixedThreadPool(9); // 創(chuàng)建一個大小為9的固定線程池,可以按照CPU的核數(shù)初步判定,如果CPU密集性任務(wù)則創(chuàng)建N+1個,如果是IO密集型任務(wù)則創(chuàng)建2N+1個,其中N即CPU的核數(shù) protected void shutdown(){ // do something // 這個方法等待線程池中所有已提交任務(wù)執(zhí)行結(jié)束,不接收新任務(wù),然后結(jié)束 executor.shutdown(); // 這個強制結(jié)束所有任務(wù),然后正在等在的任務(wù)列表 // executor.shutdownNow(); } protected void execute(Runnable command){ // do something // 提交任務(wù) executor.execute(command); } public void status(){ StringBuffer sb = new StringBuffer(); // 當(dāng)前正在執(zhí)行任務(wù)的線程數(shù) sb.append(executor.getActiveCount() + "\n"); // 當(dāng)前正在等待執(zhí)行的線程數(shù) sb.append(executor.getQueue().size() + "\n"); // 返回已經(jīng)完成的線程數(shù) sb.append(executor.getCompletedTaskCount() + "\n"); System.out.println(sb.toString()); // 注:以上方法都是返回一個大概值,因為線程在執(zhí)行中,這些狀態(tài)隨時都會改變 } }
public class Launcher{ private TaskPool taskPool = new TaskPool(); public static void main(String[] args){ // 新建100個任務(wù),Runnable的實現(xiàn)類Task Task[] tasks = new Task[100]; for (int i = 0; i < tasks.length; i++){ tasks[i] = new Task("Task " + (i+1)); // 提交到線程池運行 taskPool.execute(task[i]); if ( i % 50 == 0){ taskPool.status(); } } private static class Task implements Runnable{ private String name; public Task(String name){ this.name = name; } public void run(){ // do something System.out.println("我的名字是:" + this.name); } } }
1 常用的 池化技術(shù)
C3P0
DBCP
2 線程池的衍生
頻繁的創(chuàng)建線程對象和多線程之間進行上下文切換,是非常耗時間和資源的所以JDK1.5中提出了線程池技術(shù)
3 使用線程池
Exector
4 線程池的創(chuàng)建
創(chuàng)建一個固定大小的線程池 ( 最常用的方法 )
ExecutorService pool = Executors.newFixedThreadPool(2); Runnable task = new Runnable() { @Override public void run() { while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()); } } }; pool.execute(task); pool.execute(task); pool.execute(task);//線程池的帶下只有兩個 現(xiàn)在這個任務(wù)在其等待隊列中排隊等候
創(chuàng)建可變大小的線程池
ExecutorService pool = Executors.newCachedThreadPool(); Runnable task = new Runnable() { @Override public void run() { while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()); } } }; pool.execute(task); pool.execute(task); pool.execute(task);
創(chuàng)建獨立任務(wù)的線程池
ExecutorService pool = Executors.newSingleThreadExecutor(); Runnable task = new Runnable() { @Override public void run() { while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()); } } }; pool.execute(task); pool.execute(task); pool.execute(task);
創(chuàng)建可調(diào)度的線程池
ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(2); Runnable task = new Runnable() { @Override public void run() { while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()); } } }; threadPool.schedule(task, 2000, TimeUnit.MILLISECONDS);
感謝各位的閱讀!關(guān)于“Java怎么固定大小的線程池”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。