2012-01-04 9 views
0

私はRunnableを実装し、ブール値がtrueになるかどうかを正しくチェックします。スレッド戻り値のチェックは永久に

しかし、私はスレッドを開始するクラスにこの値を戻したいと思います。

私はFuture Callableで値を返すことができることに気付きました。私は何かを計算してすぐに返すことができますが、値が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

+0

私はスレッドを停止するまでisNextQuestion()をチェックしたいと思うことを意味します。 未来の呼び出し可能で、私はそれを一度チェックして戻り値を得ることができます。しかし、スレッドが生きている間はtrueになる可能性があります。永久にチェックしたいのですが、スレッド – krackmoe

答えて

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

Mhでそれを行う方法を教えてもらえますか?しかし、この「後でやり直してください」のように見えますか?私はちょうどメソッドを再度呼び出すことができません。私は同じ問題を抱えています。私はこのアクティビティから離れるまでチェックしなければなりません。 – krackmoe

+0

はい、結果がnullでない限り、私があなたのプログラムについてもう少し分かっていれば、私はより具体的になるかもしれません。あなたの活動は投票の間に何をしなければならないのですか? – Jay

+0

また、アクティビティではなく、別のスレッドでResultCheckerを実行するようにアクティビティを正確に指定する理由は何ですか? – Jay

0

元のスレッドにハンドラを作成します。その値を返すときにそのハンドラでメッセージを送信します。メッセージは結果となる任意のオブジェクトを含むことができます。ハンドラは元のスレッドのhandleMessageメソッドを実行します。ここで送信されたメッセージを調べて結果に反応します。

0

私はあなたがこれで間違って何**永久**

によって何を意味するか理解できないのですか?

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

を終了するまで正しい結果を受け取ってもらいたいのですが、drawView.isNextQuestion()を一度チェックしてfalseを返すのでです。しかし、この値は変わる可能性があり、それは真実になる可能性があるので、スレッドはそれを完了しない限りそれをチェックしなければならない – krackmoe

+0

これは良いアイデアかどうかはわかりませんが、if条件の中でフィールド変数を設定することもできます。 'if(cond){ここでフィールドを設定するためにセッターを使う..}' –

0

元のスレッドに戻り値を取得する方法は2つあります。

  1. 元のスレッドが定期的に戻り値が利用可能であるかどうかを確認するためにResultCheckerをポーリングすることができます。
  2. 元のスレッドはブロックでき、ResultCheckerは値を返すときに元のスレッドを起動します。

あなたが好きな方法を教えてもらえれば、詳細を伝えることができます。

+0

しかし、元のスレッドはありません。 私はこのスレッドを開始するアクティビティを持っています。 スレッドでスレッドを行う必要があるのですか? しかし、私は最初の方法を好むだろう.. – krackmoe

+0

"元のスレッド"とは、値を返したいスレッドを意味します。結果がどんなスレッドになるかは問題ではありません。重要なのは、値が別のスレッドに送信されていることだけです。 – Jay

+0

さて、方法Nr.1 – krackmoe

関連する問題