Java - 等待Runnable完成

时间:2015-12-25 01:54:39

标签: java android multithreading

在我的应用中,我在后台线程上运行以下代码:

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执行完毕后继续后台线程。我被告知上面的代码应该注意这一点,但有两件事我不明白:

  1. 如果后台线程获取了myRunnable的锁,那么在它能够调用notify()之前不应该是myRunnable阻塞吗?

  2. 我怎么知道在wait()之前没有调用notify()?

4 个答案:

答案 0 :(得分:5)

  1. myRunnable.wait()将释放myRunnable并等待通知
  2. 的锁定
  3. 我们总是在等待之前添加一张支票。

    //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)

  1. 等待开始时锁定被释放
  2. 这是一种可能性,您可以通过将runOnUiThread置于synchronized块中来避免它(以便在另一个线程已经等待之前,runnable无法获取锁定)

答案 3 :(得分:0)

创建名为Object的{​​{1}}。然后在lock之后,您可以致电runOnUiThread(myRunnable);。当您的lock.wait()完成工作后,请致电myRunnable。但是您必须将lock.notify()声明为内部类,以便它们可以共享MyRunnable对象。