在我的应用中,我在后台线程上运行以下代码:
MyRunnable myRunnable = new MyRunnable();
runOnUiThread(myRunnable);
synchronized (myRunnable) {
myRunnable.wait();
}
//rest of my code
MyRunnable看起来像这样:
public class MyRunnable implements Runnable {
public void run() {
//do some tasks
synchronized (this) {
this.notify();
}
}
}
我想在myRunnable执行完毕后继续后台线程。我被告知上面的代码应该注意这一点,但有两件事我不明白:
如果后台线程获取了myRunnable的锁,那么在它能够调用notify()之前不应该是myRunnable阻塞吗?
我怎么知道在wait()之前没有调用notify()?
答案 0 :(得分:5)
myRunnable.wait()
将释放myRunnable
并等待通知我们总是在等待之前添加一张支票。
//synchronized wait block
while(myRunnable.needWait){
myRunnable.wait();
}
//synchronized notify block
this.needWait = false;
myRunnable.notify();
答案 1 :(得分:3)
你也可以像这样使用JDK的标准RunnableFuture:
RunnableFuture<Void> task = new FutureTask<>(runnable, null);
runOnUiThread(task);
try {
task.get(); // this will block until Runnable completes
} catch (InterruptedException | ExecutionException e) {
// handle exception
}
答案 2 :(得分:0)
runOnUiThread
置于synchronized
块中来避免它(以便在另一个线程已经等待之前,runnable无法获取锁定)答案 3 :(得分:0)
创建名为Object
的{{1}}。然后在lock
之后,您可以致电runOnUiThread(myRunnable);
。当您的lock.wait()
完成工作后,请致电myRunnable
。但是您必须将lock.notify()
声明为内部类,以便它们可以共享MyRunnable
对象。