簡體   English   中英

等到所有線程都在等待之前,先通知

[英]Wait until all threads are waiting before first notify

MyClass我像這樣在循環中創建多個線程:

for(int i = 0; i < 4; i++)
{
    threads[i] = new Thread(new MyRunnable(lock));
    threads[i].start();
}

其中lockMyClass的屬性,並且每個線程在其run方法中都調用lock.wait()

創建完這些線程后,我想分配其中一個鎖控制權。 我試着簡單地將lock.notify()放在循環之后,但這運行得太早了-盡管它在循環之后,但沒有一個線程執行過lock.wait() ,所以它們都錯過了lock.notify()和然后無限期地等待另一個永遠不會到來的。

我可以暫停主線程的執行,例如在調用lock.notify()之前執行Thread.sleep(1000) lock.notify() 之所以起作用,是因為它使線程有機會在notify它們之前進入wait階段。 但這似乎不太優雅,顯然我不希望這樣停止程序的主要執行。

我應該如何實現呢?

您可以使用並發包中的一些更高級的構造,例如Semaphore

因此,您需要在循環之前使用一個“許可”來設置信號量,然后將其傳遞給線程,然后所有這些人都將嘗試“獲取”該許可(其中只有一個可以執行,其他會失敗)在那個)。

甚至Semaphore都是低級的,通常您可以找到更適合您的實際應用程序的內容,例如阻塞隊列或並發集合。

看一下Thread.join()方法,該方法可以幫助您等待當前線程,直到調用此方法的線程未完成為止。

例:

Thread t1 = new Thread();
Thread t2 = new Thread();
t1.start();
t1.join();
t2.start();

這里t2將等待t1完成。 有關它的更多信息,您可以在這里閱讀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM