2012-01-04 73 views
0

我實現了一個Runnable,它檢查布爾值是否爲true。線程返回值永久檢查

但我想把這個值返回到我的類,我開始線程。

我注意到我可以用Future Callables返回一個值,他們可以計算一些東西然後馬上返回,但是如果值變成true,我不能永久檢查。

我該如何做到這一點?

謝謝你的幫助。

public class ResultChecker implements Runnable{ 
    private DrawView drawView; 

    public ResultChecker(DrawView drawView){ 
     this.drawView = drawView; 
    } 

    public void run() { 
     boolean run = true; 
     while(run){ 
      if(drawView.isNextQuestion()){ 
       //RETURN VALUE HERE 
       run = false; 
      } 
     } 
    } 

} 
+0

你可以嘗試和重述嗎? 「永久檢查」是什麼意思? – fdreger 2012-01-04 23:12:16

+0

我的意思是我想檢查isNextQuestion(),直到我停止線程。 隨着未來可調整,我可以檢查一次,並得到一個返回值將是錯誤的。但它可以變成真正的線程是活着..所以我想永久檢查它,並希望得到正確的結果,直到我完成線程 – krackmoe 2012-01-04 23:20:35

回答

1

如果你想輪詢,然後在ResultChecker創建一個方法,可以由想要返回值的線程調用。

public class ResultChecker implements Runnable{ 
    private DrawView drawView; 
    private volatile Result r; 

    public ResultChecker(DrawView drawView){ 
     this.drawView = drawView; 
     this.r = null; 
    } 

    public Result poll() { 
     return r; 
    } 

    public void run() { 
     boolean run = true; 
     while(run){ 
      if(drawView.isNextQuestion()){ 
       //RETURN VALUE HERE 
       r = someObject; 
       // once r has been assigned, you cannot touch it again 
       // or the object it refers to from this thread because 
       // there are no locks 
       run = false; 
      } 
     } 
    } 

} 

輪詢器將輪詢是這樣的:

r = resultChecker.poll(); 
if(r != null) { 
    // we have result 
} else { 
    // result is not ready 
    // try again later 
} 

如果你想返回多個值,你將不得不延長這個有點用的隊列。

+0

這麼做..但是這個「稍後再試」應該怎麼樣?我不能再次調用該方法,我會遇到同樣的問題..我必須檢查它,直到我離開此活動。 – krackmoe 2012-01-05 13:15:51

+0

是的,你只要再次調用它,直到結果不爲空。如果我更瞭解您的計劃,我可以更具體一些。你的活動在民意測驗之間需要做什麼? – Jay 2012-01-05 22:07:01

+0

另外,爲什麼你想讓你的Activity在一個單獨的線程中而不是在Activity中運行ResultChecker? – Jay 2012-01-05 22:12:08

0

在原始線程中創建一個處理程序。然後當你想要返回值時在該處理程序上發送消息;該消息可以包含將成爲結果的任意對象。處理程序將在原始線程上執行它的handleMessage方法,您可以在其中檢查發送的消息並對結果作出反應。

0

我不明白你是什麼意思** **永久

這有什麼錯呢?

public Boolean call() { .. do something.. 
     return bool;  } 
+0

因爲它只檢查一次drawView.isNextQuestion()並返回false。但是這個值可能會改變,並且它可能會變成true,所以線程應該檢查它,只要我不完成它 – krackmoe 2012-01-04 23:19:33

+0

我不確定這是一個好主意,但是您也可以嘗試在if條件中設置一個字段變量。 '如果(cond){在這裏使用setter來設置字段var ..}' – 2012-01-04 23:27:40

0

有兩種方法來獲取返回值回原線:

  1. 原來的線程可以定期輪詢ResultChecker看看如果返回值是可用的。
  2. 原始線程可以阻塞,並且ResultChecker將在它想要返回值時喚醒原始線程。

如果你告訴我你喜歡哪種方法,我可以告訴你細節。

+0

但是我沒有原始線程。 我有一個活動,我開始這個線程。 你的意思是我應該做一個線程中的線程? 但我更喜歡第一種方法.. – krackmoe 2012-01-04 23:24:11

+0

「原始線程」我的意思是你想要返回值的任何線程。我並不在乎結果會怎樣。唯一重要的是值被髮送到另一個線程。 – Jay 2012-01-04 23:31:17

+0

好的,你能告訴我怎麼用方法Nr.1 – krackmoe 2012-01-04 23:34:14