我想暫停主執行緒,直到另一個執行緒完成。我試過CountDownLatch和信號量。但他們都沒有作業。我對兩者都有同樣的錯誤。
原因:java.lang.IllegalMonitorStateException:物件未在等待()之前被執行緒鎖定
代碼
public void testCountDownLatch(){
final CountDownLatch countDownLatch = new CountDownLatch(1);
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
countDownLatch.countDown();
//Toast.makeText(MainActivity.this, "Latch Released", Toast.LENGTH_SHORT).show();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
try {
countDownLatch.wait();
Toast.makeText(this, "Yes! I am free now", Toast.LENGTH_SHORT).show();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
我嘗試搜索了幾個小時并且能夠理解錯誤的原因(wait()不知道是否countdown()在它之前被呼叫,在這種情況下它會永遠等待)但我無法理解如何修復它:(
uj5u.com熱心網友回復:
您正在呼叫錯誤的方法。您需要使用await()而不是wait().
wait()是一個方法 fromObject并且該方法需要synchronize覆寫該物件。其他同步器通常比Object#wait. 鎖定的物件可以用或Object#wait喚醒。Object#notifyObject#notifyAll
await()是 的一種方法,CountDownLatch它等待CountDownLatch倒計時(使用CountDownLatch#countDown)到 0。
如果您使用Semaphore(基本上與 相反CountDownLatch),您可以使用 獲取(如果尚未達到其限制,則將信號量的計數增加 1)Semaphore#aquire并釋放(減少信號量的計數)Semaphore#release。
除此之外,您似乎正在開發一個 Android 應用程式。您永遠不應阻塞 Android 應用程式的主執行緒(或任何圖形應用程式的 UI 執行緒),因為這會阻塞您的 UI 并導致Application not responding通知。阻塞 UI(執行緒)意味著您的應用程式不會回應任何 UI 事件(例如用戶點擊按鈕)。如果你需要做阻塞的東西,你應該在后臺/作業執行緒中做。出于這個原因,您還應該避免在主執行緒中執行 IO 操作(android 甚至會阻止主執行緒中的網路操作)。
uj5u.com熱心網友回復:
您使用了錯誤的方法。你應該打電話await,而不是wait。有關示例代碼,請參見CountDownLatch。
uj5u.com熱心網友回復:
解決方案
您忘記start了執行緒,因此例外非常明顯。
在等待()之前沒有被執行緒鎖定的物件
發生的事情是wait()直接呼叫而不呼叫countdown()方法(因為執行緒沒有啟動)所以它拋出IllegalMonitorStateException,否則你的程式會在不讓你知道的情況下等待你的整個生命。
解決方案
只需呼叫start()執行緒上的方法。
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
countDownLatch.countDown();
Toast.makeText(MainActivity.this, "Latch Released", Toast.LENGTH_SHORT).show();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
uj5u.com熱心網友回復:
1.執行緒應該啟動 2.應該等待而不是等待。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/475211.html
上一篇:Java無法編輯執行緒秒表超時
