![](/img/trans.png)
[英]IllegalMonitorStateException: object not locked by thread before wait(), using synchronized static method
[英]Write a static synchronized method (wait for a result from thread)
我的任務有問題。 也就是說,我們必須編寫一個從Threads調用的類。 其中一種方法是:
public static synchronized void waitForResults() {
}
因此,Master-Thread調用此方法,然后Master-Thread觸發另一個Thread,即要完成新工作。 我怎么能告訴Master-Thread他睡覺,而Worker-Thread有效?
使用wait()
和notify()
機制。 每個java對象都擁有這些方法。 機制阻塞線程直到滿足某些條件。
例如,如果您的主線程調用另一個將更改result
變量值的線程。 然后,您可以wait
result
直到它被其他一些線程notified
:
private static StringBuilder result= new StringBuilder();
public static void mainThreadWork() {
new WorkerThread().start();
synchronized (result) {
System.out.println(result.toString()); //prints ""
result.wait();
System.out.println(result.toString()); //prints "modified"
}
}
private static class WorkerThread extends Thread {
@Override
public void run() {
synchronized(result) {
result.append("modified");
result.notify();
}
}
}
會發生什么:當一個線程調用某個對象的wait
時,它會向其他線程產生一個CPU,並且(如方法名所示)等待另一個線程在該線程上發送一個notify
信號。 notify
將CPU輸出到正在等待該對象的線程。
必須遵守一些規則,例如,必須在synchronized
塊內調用wait()
和notify()
。
從Java 1.5開始,有更多抽象級別的同步和等待通知機制,因此您可以檢查java的concurrent
庫 。 它允許您在更抽象的對象級別上鎖定和等待對象:
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
因此,而不是synchronized
塊和waits
並notifies
你可以只:
public static void mainThreadWork() {
lock.lock();
new WorkerThread().start();
System.out.println(result.toString()); //prints ""
condition.await();
System.out.println(result.toString()); //prints "modified"
lock.unlock();
}
在WorkerThread
:
@Override
public void run() {
lock.lock();
result.append("modified");
condition.singal();
lock.unlock();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.