2015-12-25 92 views
1

在我的應用程序,我已經在後臺線程運行下面的代碼:爪哇 - 等待了Runnable完成

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的鎖,那麼不應該myRunnable塊它能夠前調用notify()?

  2. 如何知道notify()在wait()之前未被調用?

+0

你可能要考慮通過[ListenableFuture#的addListener]實施這個(http://docs.guava-libraries.googlecode.com/git/ javadoc/com/google/common/util/concurrent/ListenableFuture.html#addListener(java.lang.Runnable,%20java.util.concurrent.Executor))(for Java7)or [CompletableFuture#thenRunAsync](https:// docs .oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html#thenRunAsync-java.lang.Runnable-java.util.concurrent.Executor-)(for Java8)等待'/'通知' –

+0

爲什麼不使用'''Thread.join()'''? – saka1029

回答

3
  1. myRunnable.wait()將發佈的myRunnable鎖,並等待通知
  2. 我們總是在等待之前添加支票。

    //synchronized wait block 
    while(myRunnable.needWait){ 
        myRunnable.wait(); 
    } 
    
    //synchronized notify block 
    this.needWait = false; 
    myRunnable.notify(); 
    
0
  1. 當等待開始
  2. 這是一個可能的鎖被釋放,你可以通過將runOnUiThread的​​塊內太(這樣可運行無法獲取鎖,直到避免其他線程已經等待)
0

創建一個名爲Objectlock。然後在runOnUiThread(myRunnable);之後,您可以撥打lock.wait()。當你的myRunnable完成它的工作,請撥打lock.notify()。但是您必須聲明MyRunnable爲內部類,因此它們可以共享lock對象。

2

您也可以使用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 
}