當前位置:首頁 » 溫度調節 » 線程池大小多少合適

線程池大小多少合適

發布時間: 2022-09-03 08:13:32

⑴ 如何設定線程池的大小

只要您遵循幾條簡單的准則,線程池可以成為構建伺服器應用程序的極其有效的方法:
不要對那些同步等待其它任務結果的任務排隊。這可能會導致上面所描述的那種形式的死鎖,在那種死鎖中,所有線程都被一些任務所佔用,這些任務依次等待排隊任務的結果,而這些任務又無法執行,因為所有的線程都很忙。
在為時間可能很長的操作使用合用的線程時要小心。如果程序必須等待諸如 I/O 完成這樣的某個資源,那麼請指定最長的等待時間,以及隨後是失效還是將任務重新排隊以便稍後執行。這樣做保證了:通過將某個線程釋放給某個可能成功完成的任務,從而將最終取得某些進展。
理解任務
要有效地調整線程池大小,您需要理解正在排隊的任務以及它們正在做什麼。它們是 CPU 限制的(CPU-bound)嗎?它們是 I/O 限制的(I/O-bound)嗎?您的答案將影響您如何調整應用程序。如果您有不同的任務類,這些類有著截然不同的特徵,那麼為不同任務類設置多個工作隊列可能會有意義,這樣可以相應地調整每個池。
調整池的大小
調整線程池的大小基本上就是避免兩類錯誤:線程太少或線程太多。幸運的是,對於大多數應用程序來說,太多和太少之間的餘地相當寬。
請回憶:在應用程序中使用線程有兩個主要優點,盡管在等待諸如 I/O 的慢操作,但允許繼續進行處理,並且可以利用多處理器。在運行於具有 N 個處理器機器上的計算限制的應用程序中,在線程數目接近 N 時添加額外的線程可能會改善總處理能力,而在線程數目超過 N 時添加額外的線程將不起作用。事實上,太多的線程甚至會降低性能,因為它會導致額外的環境切換開銷。
線程池的最佳大小取決於可用處理器的數目以及工作隊列中的任務的性質。若在一個具有 N 個處理器的系統上只有一個工作隊列,其中全部是計算性質的任務,在線程池具有 N 或 N+1 個線程時一般會獲得最大的 CPU 利用率。
對於那些可能需要等待 I/O 完成的任務(例如,從套接字讀取 HTTP 請求的任務),需要讓池的大小超過可用處理器的數目,因為並不是所有線程都一直在工作。通過使用概要分析,您可以估計某個典型請求的等待時間(WT)與服務時間(ST)之間的比例。如果我們將這一比例稱之為 WT/ST,那麼對於一個具有 N 個處理器的系統,需要設置大約 N*(1+WT/ST) 個線程來保持處理器得到充分利用。
處理器利用率不是調整線程池大小過程中的唯一考慮事項。隨著線程池的增長,您可能會碰到調度程序、可用內存方面的限制,或者其它系統資源方面的限制,例如套接字、打開的文件句柄或資料庫連接等的數目。

⑵ 什麼叫線程池線程池如何使用

1、什麼是線程池: java.util.concurrent.Executors提供了一個 java.util.concurrent.Executor介面的實現用於創建線程池
多線程技術主要解決處理器單元內多個線程執行的問題,它可以顯著減少處理器單元的閑置時間,增加處理器單元的吞吐能力。
假設一個伺服器完成一項任務所需時間為:T1 創建線程時間,T2 在線程中執行任務的時間,T3 銷毀線程時間。
如果:T1 + T3 遠大於 T2,則可以採用線程池,以提高伺服器性能。
一個線程池包括以下四個基本組成部分:
1、線程池管理器(ThreadPool):用於創建並管理線程池,包括 創建線程池,銷毀線程池,添加新任務;
2、工作線程(PoolWorker):線程池中線程,在沒有任務時處於等待狀態,可以循環的執行任務;
3、任務介面(Task):每個任務必須實現的介面,以供工作線程調度任務的執行,它主要規定了任務的入口,任務執行完後的收尾工作,任務的執行狀態等;
4、任務隊列(taskQueue):用於存放沒有處理的任務。提供一種緩沖機制。
線程池技術正是關注如何縮短或調整T1,T3時間的技術,從而提高伺服器程序性能的。它把T1,T3分別安排在伺服器程序的啟動和結束的時間段或者一些空閑的時間段,這樣在伺服器程序處理客戶請求時,不會有T1,T3的開銷了。
線程池不僅調整T1,T3產生的時間段,而且它還顯著減少了創建線程的數目,看一個例子:
假設一個伺服器一天要處理50000個請求,並且每個請求需要一個單獨的線程完成。在線程池中,線程數一般是固定的,所以產生線程總數不會超過線程池中線程的數目,而如果伺服器不利用線程池來處理這些請求則線程總數為50000。一般線程池大小是遠小於50000。所以利用線程池的伺服器程序不會為了創建50000而在處理請求時浪費時間,從而提高效率。

⑶ 線程池設的的大小不能超過cpu數嗎

線程數量可以超過cpu數目,一個cpu核心可以通過分時切片來運行多個線程。幾千個線程都可以。
但一般來說線程池線程數量匹配cpu核數量的話性能會比較好,每個線程都會分配到一個物理cpu核心上,但這不是一定的,要看線程的具體業務情況。

⑷ java線程池如何合理的設置大小

  • 最佳線程數目 = ((線程等待時間+線程CPU時間)/線程CPU時間 )* CPU數目

  • 比如平均每個線程CPU運行時間為0.5s,而線程等待時間(非CPU運行時間,比如IO)為1.5s,CPU核心數為8,那麼根據上面這個公式估算得到:((0.5+1.5)/0.5)*8=32。這個公式進一步轉化為:view sourceprint?

  • 最佳線程數目 = (線程等待時間與線程CPU時間之比 + 1)* CPU數目

  • 可以得出一個結論:

  • 線程等待時間所佔比例越高,需要越多線程。線程CPU時間所佔比例越高,需要越少線程。

⑸ 什麼是線程池

1、線程池簡介:

多線程技術主要解決處理器單元內多個線程執行的問題,它可以顯著減少處理器單元的閑置時間,增加處理器單元的吞吐能力。

假設一個伺服器完成一項任務所需時間為:T1 創建線程時間,T2 在線程中執行任務的時間,T3 銷毀線程時間。


如果:T1 + T3 遠大於 T2,則可以採用線程池,以提高伺服器性能。

一個線程池包括以下四個基本組成部分:

1、線程池管理器(ThreadPool):用於創建並管理線程池,包括 創建線程池,銷毀線程池,添加新任務;

2、工作線程(PoolWorker):線程池中線程,在沒有任務時處於等待狀態,可以循環的執行任務;

3、任務介面(Task):每個任務必須實現的介面,以供工作線程調度任務的執行,它主要規定了任務的入口,任務執行完後的收尾工作,任務的執行狀態等;

4、任務隊列(taskQueue):用於存放沒有處理的任務。提供一種緩沖機制。

線程池技術正是關注如何縮短或調整T1,T3時間的技術,從而提高伺服器程序性能的。它把T1,T3分別安排在伺服器程序的啟動和結束的時間段或者一些空閑的時間段,這樣在伺服器程序處理客戶請求時,不會有T1,T3的開銷了。

線程池不僅調整T1,T3產生的時間段,而且它還顯著減少了創建線程的數目,看一個例子:

假設一個伺服器一天要處理50000個請求,並且每個請求需要一個單獨的線程完成。在線程池中,線程數一般是固定的,所以產生線程總數不會超過線程池中線程的數目,而如果伺服器不利用線程池來處理這些請求則線程總數為50000。一般線程池大小是遠小於50000。所以利用線程池的伺服器程序不會為了創建50000而在處理請求時浪費時間,從而提高效率。


代碼實現中並沒有實現任務介面,而是把Runnable對象加入到線程池管理器(ThreadPool),然後剩下的事情就由線程池管理器(ThreadPool)來完成了



[java] view plain

package mine.util.thread;

import java.util.LinkedList;

import java.util.List;

/**

* 線程池類,線程管理器:創建線程,執行任務,銷毀線程,獲取線程基本信息

*/

public final class ThreadPool {

// 線程池中默認線程的個數為5

private static int worker_num = 5;

// 工作線程

private WorkThread[] workThrads;

// 未處理的任務

private static volatile int finished_task = 0;

// 任務隊列,作為一個緩沖,List線程不安全

private List<Runnable> taskQueue = new LinkedList<Runnable>();

private static ThreadPool threadPool;

// 創建具有默認線程個數的線程池

private ThreadPool() {

this(5);

}

// 創建線程池,worker_num為線程池中工作線程的個數

private ThreadPool(int worker_num) {

ThreadPool.worker_num = worker_num;

workThrads = new WorkThread[worker_num];

for (int i = 0; i < worker_num; i++) {

workThrads[i] = new WorkThread();

workThrads[i].start();// 開啟線程池中的線程

}

}

// 單態模式,獲得一個默認線程個數的線程池

public static ThreadPool getThreadPool() {

return getThreadPool(ThreadPool.worker_num);

}

// 單態模式,獲得一個指定線程個數的線程池,worker_num(>0)為線程池中工作線程的個數

// worker_num<=0創建默認的工作線程個數

public static ThreadPool getThreadPool(int worker_num1) {

if (worker_num1 <= 0)

worker_num1 = ThreadPool.worker_num;

if (threadPool == null)

threadPool = new ThreadPool(worker_num1);

return threadPool;

}

// 執行任務,其實只是把任務加入任務隊列,什麼時候執行有線程池管理器覺定

public void execute(Runnable task) {

synchronized (taskQueue) {

taskQueue.add(task);

taskQueue.notify();

}

}

// 批量執行任務,其實只是把任務加入任務隊列,什麼時候執行有線程池管理器覺定

public void execute(Runnable[] task) {

synchronized (taskQueue) {

for (Runnable t : task)

taskQueue.add(t);

taskQueue.notify();

}

}

// 批量執行任務,其實只是把任務加入任務隊列,什麼時候執行有線程池管理器覺定

public void execute(List<Runnable> task) {

synchronized (taskQueue) {

for (Runnable t : task)

taskQueue.add(t);

taskQueue.notify();

}

}

// 銷毀線程池,該方法保證在所有任務都完成的情況下才銷毀所有線程,否則等待任務完成才銷毀

public void destroy() {

while (!taskQueue.isEmpty()) {// 如果還有任務沒執行完成,就先睡會吧

try {

Thread.sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

// 工作線程停止工作,且置為null

for (int i = 0; i < worker_num; i++) {

workThrads[i].stopWorker();

workThrads[i] = null;

}

threadPool=null;

taskQueue.clear();// 清空任務隊列

}

// 返回工作線程的個數

public int getWorkThreadNumber() {

return worker_num;

}

// 返回已完成任務的個數,這里的已完成是只出了任務隊列的任務個數,可能該任務並沒有實際執行完成

public int getFinishedTasknumber() {

return finished_task;

}

// 返回任務隊列的長度,即還沒處理的任務個數

public int getWaitTasknumber() {

return taskQueue.size();

}

// 覆蓋toString方法,返回線程池信息:工作線程個數和已完成任務個數

@Override

public String toString() {

return "WorkThread number:" + worker_num + " finished task number:"

+ finished_task + " wait task number:" + getWaitTasknumber();

}

/**

* 內部類,工作線程

*/

private class WorkThread extends Thread {

// 該工作線程是否有效,用於結束該工作線程

private boolean isRunning = true;

/*

* 關鍵所在啊,如果任務隊列不空,則取出任務執行,若任務隊列空,則等待

*/

@Override

public void run() {

Runnable r = null;

while (isRunning) {// 注意,若線程無效則自然結束run方法,該線程就沒用了

synchronized (taskQueue) {

while (isRunning && taskQueue.isEmpty()) {// 隊列為空

try {

taskQueue.wait(20);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

if (!taskQueue.isEmpty())

r = taskQueue.remove(0);// 取出任務

}

if (r != null) {

r.run();// 執行任務

}

finished_task++;

r = null;

}

}

// 停止工作,讓該線程自然執行完run方法,自然結束

public void stopWorker() {

isRunning = false;

}

}

}


測試代碼:


[java] view plain

package mine.util.thread;

//測試線程池

public class TestThreadPool {

public static void main(String[] args) {

// 創建3個線程的線程池

ThreadPool t = ThreadPool.getThreadPool(3);

t.execute(new Runnable[] { new Task(), new Task(), new Task() });

t.execute(new Runnable[] { new Task(), new Task(), new Task() });

System.out.println(t);

t.destroy();// 所有線程都執行完成才destory

System.out.println(t);

}

// 任務類

static class Task implements Runnable {

private static volatile int i = 1;

@Override

public void run() {// 執行任務

System.out.println("任務 " + (i++) + " 完成");

}

}

}



運行結果:


WorkThread number:3 finished task number:0 wait task number:6

任務 1 完成

任務 2 完成

任務 3 完成

任務 4 完成

任務 5 完成

任務 6 完成

WorkThread number:3 finished task number:6 wait task number:0


分析:由於並沒有任務介面,傳入的可以是自定義的任何任務,所以線程池並不能准確的判斷該任務是否真正的已經完成(真正完成該任務是這個任務的run方法執行完畢),只能知道該任務已經出了任務隊列,正在執行或者已經完成。



你好,本題已解答,如果滿意

請點右下角「採納答案」。

http://blog.csdn.net/hsuxu/article/details/8985931

⑹ 線程數設置和CPU數的關系

一般說來,大家認為線程池的大小經驗值應該這樣設置:(其中N為CPU的個數)

  • 如果是CPU密集型應用,則線程池大小設置為N+1

  • 如果是IO密集型應用,則線程池大小設置為2N+1(因為io讀數據或者緩存的時候,線程等待,此時如果多開線程,能有效提高cpu利用率)

  • 如果一台伺服器上只部署這一個應用並且只有這一個線程池,那麼這種估算或許合理,具體還需自行測試驗證。

    但是,IO優化中,這樣的估算公式可能更適合:

    最佳線程數目 = ((線程等待時間+線程CPU時間)/線程CPU時間 )* CPU數目

    因為很顯然,線程等待時間所佔比例越高,需要越多線程。線程CPU時間所佔比例越高,需要越少線程。

    下面舉個例子:

    比如平均每個線程CPU運行時間為0.5s,而線程等待時間(非CPU運行時間,比如IO)為1.5s,CPU核心數為8,那麼根據上面這個公式估算得到:((0.5+1.5)/0.5)*8=32。這個公式進一步轉化為:

    最佳線程數目 = (線程等待時間與線程CPU時間之比 + 1)* CPU數目

⑺ java 什麼是線程池

找的資料,你看一下吧:
多線程技術主要解決處理器單元內多個線程執行的問題,它可以顯著減少處理器單元的閑置時間,增加處理器單元的吞吐能力。

假設一個伺服器完成一項任務所需時間為:T1 創建線程時間,T2 在線程中執行任務的時間,T3 銷毀線程時間。

如果:T1 + T3 遠大於 T2,則可以採用線程池,以提高伺服器性能。
一個線程池包括以下四個基本組成部分:
1、線程池管理器(ThreadPool):用於創建並管理線程池,包括 創建線程池,銷毀線程池,添加新任務;
2、工作線程(PoolWorker):線程池中線程,在沒有任務時處於等待狀態,可以循環的執行任務;
3、任務介面(Task):每個任務必須實現的介面,以供工作線程調度任務的執行,它主要規定了任務的入口,任務執行完後的收尾工作,任務的執行狀態等;
4、任務隊列(taskQueue):用於存放沒有處理的任務。提供一種緩沖機制。

線程池技術正是關注如何縮短或調整T1,T3時間的技術,從而提高伺服器程序性能的。它把T1,T3分別安排在伺服器程序的啟動和結束的時間段或者一些空閑的時間段,這樣在伺服器程序處理客戶請求時,不會有T1,T3的開銷了。

線程池不僅調整T1,T3產生的時間段,而且它還顯著減少了創建線程的數目,看一個例子:

假設一個伺服器一天要處理50000個請求,並且每個請求需要一個單獨的線程完成。在線程池中,線程數一般是固定的,所以產生線程總數不會超過線程池中線程的數目,而如果伺服器不利用線程池來處理這些請求則線程總數為50000。一般線程池大小是遠小於50000。所以利用線程池的伺服器程序不會為了創建50000而在處理請求時浪費時間,從而提高效率。

⑻ 什麼樣的java線程池可以使用處理數據從插座嗎

Java通過Executors提供四種線程池,分別為:
newCachedThreadPool創建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。
newFixedThreadPool 創建一個定長線程池,可控制線程最大並發數,超出的線程會在隊列中等待。
newScheledThreadPool 創建一個定長線程池,支持定時及周期性任務執行。
newSingleThreadExecutor 創建一個單線程化的線程池,它只會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先順序)執行。

(1) newCachedThreadPool
創建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。示例代碼如下:

Java代碼

選擇我們運行的程序:

監控運行狀態

熱點內容
馬路上汽車的噪音在多少分貝 發布:2023-08-31 22:08:23 瀏覽:1812
應孕棒多少錢一盒 發布:2023-08-31 22:08:21 瀏覽:1293
標准養老金一年能領多少錢 發布:2023-08-31 22:05:05 瀏覽:1577
湖北通城接網線多少錢一個月 發布:2023-08-31 21:59:51 瀏覽:1662
開隨車吊車多少錢一個月 發布:2023-08-31 21:55:06 瀏覽:1420
京東付尾款怎麼知道前多少名 發布:2023-08-31 21:52:58 瀏覽:1743
在學校租鋪面一個月要多少錢 發布:2023-08-31 21:52:09 瀏覽:1875
2寸有多少厘米 發布:2023-08-31 21:50:34 瀏覽:1524
知道電壓如何算一小時多少電 發布:2023-08-31 21:46:20 瀏覽:1499
金手鐲54號圈周長是多少厘米 發布:2023-08-31 21:44:28 瀏覽:1682