導航:首頁 > 編程語言 > java線程等待池

java線程等待池

發布時間:2022-09-05 17:22:46

java線程池

java常用的線程池有三種:
1.
newFixedThreadPool
public static ExecutorService newFixedThreadPool(int nThreads)創建一個可重用固定線程數的線程池,以共享的無界隊列方式來運行這些線程。在任意點,在大多數 nThreads 線程會處於處理任務的活動狀態。如果在所有線程處於活動狀態時提交附加任務,則在有可用線程之前,附加任務將在隊列中等待。如果在關閉前的執行期間由於失敗而導致任何線程終止,那麼一個新線程將代替它執行後續的任務(如果需要)。在某個線程被顯式地關閉之前,池中的線程將一直存在。

參數:
nThreads - 池中的線程數
返回:
新創建的線程池
拋出:
IllegalArgumentException - 如果 nThreads <= 0

2.
newSingleThreadExecutor
public static ExecutorService newSingleThreadExecutor()創建一個使用單個 worker 線程的 Executor,以無界隊列方式來運行該線程。(注意,如果因為在關閉前的執行期間出現失敗而終止了此單個線程,那麼如果需要,一個新線程將代替它執行後續的任務)。可保證順序地執行各個任務,並且在任意給定的時間不會有多個線程是活動的。與其他等效的 newFixedThreadPool(1) 不同,可保證無需重新配置此方法所返回的執行程序即可使用其他的線程。

返回:
新創建的單線程 Executor

3.
newCachedThreadPool
public static ExecutorService newCachedThreadPool()創建一個可根據需要創建新線程的線程池,但是在以前構造的線程可用時將重用它們。對於執行很多短期非同步任務的程序而言,這些線程池通常可提高程序性能。調用 execute 將重用以前構造的線程(如果線程可用)。如果現有線程沒有可用的,則創建一個新線程並添加到池中。終止並從緩存中移除那些已有 60 秒鍾未被使用的線程。因此,長時間保持空閑的線程池不會使用任何資源。注意,可以使用 ThreadPoolExecutor 構造方法創建具有類似屬性但細節不同(例如超時參數)的線程池。

返回:
新創建的線程池

Ⅱ Java線程狀態中BLOCKED和WAITING有什麼區別

Java線程狀態中BLOCKED和WAITING有什麼區別
新建狀態(New) 新創建了一個線程對象。
就緒狀態(Runnable) 線程對象創建後,其他線程調用了該對象的start()方法。該狀態的線程位於可運行線程池中,變得可運行,等待獲取CPU的使用權。
運行狀態(Running) 就緒狀態的線程獲取了CPU,執行程序代碼。
阻塞狀態(Blocked) 阻塞狀態是線程因為某種原因放棄CPU使用權,暫時停止運行。直到線程進入就緒狀態,才有機會轉到運行狀態。阻塞的情況分三種:
等待阻塞:運行的線程執行wait()方法,JVM會把該線程放入等待池中。
同步阻塞:運行的線程在獲取對象的同步鎖時,若該同步鎖被別的線程佔用,則JVM會把該線程放入鎖池中。
其他阻塞:運行的線程執行sleep()或join()方法,或者發出了I/O請求時,JVM會把

Ⅲ java線程wait方法

  1. wait和notify是用在多線程競爭同一鎖資源的情況下使用的。

  2. 你這段代碼實際是個單線程,這個線程自己把自己阻塞了,自然不可能自己把自己喚醒。

  3. 你的意圖怎麼實現呢?需要加入另外一個線程,下面是我仿照你的意圖寫的一段代碼,供參考下



  4. publicclassA
    {
    publicA(){
    finalAa=this;
    Threadth1=newThread(){
    @Override
    publicvoidrun(){
    //一直循環,去嘗試著喚醒a
    try
    {
    this.sleep(10000);
    }catch(InterruptedExceptione)
    {
    //TODOAuto-generatedcatchblock
    e.printStackTrace();
    }//為檢查是不是能真正實現喚醒a,等待10000毫秒,此時保證a已經處於等待狀態中。
    while(true){
    /**
    *用notify喚醒的線程必須是持有當前鎖對象的線程
    */
    synchronized(a){
    a.notify();
    }
    }
    }
    };
    th1.setDaemon(true);//這句也是必須的,將th1設為守護線程,保證在喚醒a以後,所有活動的線程都為守護線程,jvm能及時推出
    th1.start();//和a.run的順序不可以換
    this.run();
    }

    publicstaticvoidmain(String[]args)
    {
    newA();
    }

    publicvoidrun()
    {
    /**
    *這里可以換成這樣,直接鎖住this就行了
    */
    synchronized(this)
    {
    try
    {

    this.wait();//阻塞當前的線程
    }catch(InterruptedExceptione)
    {
    //TODOAuto-generatedcatchblock
    e.printStackTrace();
    }finally{
    System.out.println("1");//執行finally
    }
    }


    }

    }

Ⅳ java怎樣將多個線程放入到一個對象等待池中

TaskQueue Extends Queue
{
object taskLock = null ;

Runnable Dequeue ()
{
synchronized (taskLock)
{
while (getCount () <= 0)
{
taskLock.Wait () ;
}
return super.dequeue () ;
}
}
void Enqueue (Runnable runObject)
{
synchronized (taskLock)
{
super.enqueue (runObject) ;
taskLock.NotifyAll () ;
}
}

}

Ⅳ java如何創建一個定長線程池,可控制線程最大並發數,超出的線程會在隊列中等待。求代碼

packagetest;
importjava.util.concurrent.ExecutorService;
importjava.util.concurrent.Executors;
{
publicstaticvoidmain(String[]args){
=Executors.newFixedThreadPool(3);
for(inti=0;i<10;i++){
finalintindex=i;
fixedThreadPool.execute(newRunnable(){
publicvoidrun(){
try{
System.out.println(index);
Thread.sleep(2000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
}
});
}
}
}

因為線程池大小為3,每個任務輸出index後sleep 2秒,所以每兩秒列印3個數字。

定長線程池的大小最好根據系統資源進行設置。如Runtime.getRuntime().availableProcessors()

Ⅵ java 中1、一個線程調用了wait(),隨後被notify()喚醒,這個線程會接著執行wait

1、如果一個線程調用了某個對象的wait方法,那麼該線程進入到該對象的等待池中(並且已經將鎖釋放),
如果未來的某一時刻,另外一個線程調用了相同對象的notify方法或者notifyAll方法,
那麼該等待池中的線程就會被喚起,然後進入到對象的鎖池裡面去獲得該對象的鎖,
如果獲得鎖成功後,那麼該線程就會沿著wait方法之後的路徑繼續執行。注意是沿著wait方法之後
2.如果沒有直接性的調用同類里的其他介面,或者返回,結束等java關鍵字,代碼還是得往下執行的。

Ⅶ 如何等待java線程池中所有任務完成

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Test {

public static void main(String args[]) throws InterruptedException {
ExecutorService exe = Executors.newFixedThreadPool(50);
for (int i = 1; i <= 5; i++) {
exe.execute(new SubThread(i));
}
exe.shutdown();
while (true) {
if (exe.isTerminated()) {
System.out.println("結束了!");
break;
}
Thread.sleep(200);
}
}
}

Ⅷ 詳談Java幾種線程池類型介紹及使用方法

線程池作用就是限制系統中執行線程的數量。
根據系統的環境情況,可以自動或手動設置線程數量,達到運行的最佳效果;少了浪費了系統資源,多了造成系統擁擠效率不高。用線程池控制線程數量,其他線程 排隊等候。一個任務執行完畢,再從隊列的中取最前面的任務開始執行。若隊列中沒有等待進程,線程池的這一資源處於等待。當一個新任務需要運行時,如果線程 池中有等待的工作線程,就可以開始運行了;否則進入等待隊列。

Java裡面線程池的頂級介面是Executor,但是嚴格意義上講Executor並不是一個線程池,而只是一個執行線程的工具。真正的線程池介面是ExecutorService。ThreadPoolExecutor是Executors類的底層實現。

Ⅸ java多線程相互等待

1、存在處以業務邏輯類,存在map,初始化。
2、存在線程池 最大200,ThreadFactory可以默認
3、單線程處理ip的類,構造方法包含是需參數Map,
4、外部循環 調用線程池,生成線程 傳參 map 和當前循環次數
5、線程處理完ip後,將外部傳來的循環次數做key,結果做value插入map,喚醒主線程判斷map中的數量是否==需處理的ip的數量,選擇跳出或繼續等待。

Ⅹ java 如果wait中的線程競爭不到鎖是否重新進入wait等待池還是鎖等待池

wait中的線程是不會去競爭對象鎖的。
據我所知,開始由於調用了對象的wait方法,線程處於該對象的等待池中,
而後,只有再去調用對象的notifyAll()(喚醒所有等待池中的線程)或者notify()(隨機喚醒線程,姑且假設喚醒了我們的那個線程),線程會進入該對象的鎖池之中。
鎖池中的對象相互競爭對象鎖,優先順序高的線程競爭得到對象鎖的概率高,假若線程沒有競爭到,它還是會在鎖池之中,唯有線程再次調用wait方法,它才會重新回到等待池中。

希望對你有幫助。

閱讀全文

與java線程等待池相關的資料

熱點內容
體重小本app怎麼樣 瀏覽:777
編程語言需求 瀏覽:935
當兵體重怎麼個演算法 瀏覽:169
加密的電腦文件帶出去怎麼打開 瀏覽:849
死循環會在編譯的時候出錯嗎 瀏覽:986
c51單片機特殊寄存器的原理 瀏覽:578
閃耀永恆特利加密鑰 瀏覽:761
如何誇程序員 瀏覽:778
天津期貨python招聘 瀏覽:265
單片機機器語言寫的程序 瀏覽:553
韓國直播軟體app叫什麼名 瀏覽:920
軍營訓練不聽教官的命令 瀏覽:262
v開頭的音樂播放器是什麼APP 瀏覽:121
單片機是怎麼做出來的 瀏覽:318
博圖怎麼作為opc伺服器 瀏覽:102
編譯做題軟體 瀏覽:297
橋梁檢測pdf 瀏覽:689
化解壓力的一種方法 瀏覽:684
路由器和DSN伺服器有什麼區別 瀏覽:551
android伸縮控制項 瀏覽:861