2016-11-10 8 views
2

(初心者警告)同じクラスの別のメソッドがクラス変数の1つを更新したメソッドの中でどのように検出するか?

私はリスナーインターフェース(SomeListener)を実装するクラスMyClassを持っています。 MyClassにはcountAとcountBという2つのカウンタが含まれています。 MyClassは、OtherClassにリスナーとして追加されます。 OtherClassで何かが起こると、MyClassメソッドのincrementAまたはincremenetBが発生します。

MyClassには、ThirdClassから呼び出されるメソッドmyMethodもあります。次に、サーバーに要求のリストを送信します。サーバーは、各要求に対してOtherClassに応答します。 OtherClassはincrementAまたはincrementBを起動します。

私の問題:私は、サーバーがすべての要求に対してOtherClassに応答した後でのみ、myMethodを返すことをお勧めします。私はこれを働かせるように見えない。これは、これまでの私のコードのスケッチです:

class MyClass implements SomeListener{ 

    private int counterA; 
    private int counterB; 
    private int numRequests; 

    public boolean myMethod(){ 

     // send numRequests number of requests to a serve 

     long start = System.currentTimeMillis(); 
     long end = start + 1000*numObjects; 

     //wait for responses to all the requests, or timeout 
     while(counterA+counterB < numRequests && currenttime<end){ 
      //wait... in a probably not so elegant fashion 
     } 

     if(counterA+counterB==numRequests){ 
      // do something 
      return true 
     } 

     // timed out 
     //do something else 
     return false; 
    } 


    public void incrementA(){ 
     counterA++; 
    } 

    public void incrementB(){ 
     counterB++; 
    } 
} 


class SomeListener{ 
    public void incrementA(); 
    public void incrementB(); 
} 


class OtherClass{ 

    MyClass myClassObject = new myClassObject(); 

    //receives response from server and write to log 

    if(response equals something) 
     myClassObject.incrementA; 
    else  
     myClassObject.incrementB; 
} 


class ThirdClass{ 

    MyClass myClassObject = new MyClassObject(); 
    if (myClassObject.myMethod()){ 
     // do something 
    } 
} 

私の問題はcounterAまたはcounterBがincrementA/B-方法でインクリメントされた場合にmymethodが登録していないということです。これは、OtherClassがサーバーからの応答を受信して​​からずっとずっとタイムアウトするまで実行されます。誰も私の方法のエラーを私に見せてもらえますか?

+0

問題をコンパイルして示すコードを投稿してください。 a [mcve]。質問のコードはコンパイルされません。なぜなら、呼び出すことなく関数を参照した場所の少なくとも数箇所、囲みメソッドなどを持たないクラス本体にステップバイステップのコードが書かれているからです。 –

+2

基本的に: 'incrementM'または' incrementB'が 'myMethod'が実行されている間に別のスレッドによって呼び出されると、' myMethod'は最終的に値の変化を見るでしょう。 'counterA'と' counterB'を 'volatile'にすると、' myMethod'はそれらの変更を直ちに見るようになります。 –

+0

@ T.J.Crowder答えとして書くと、私はそれをupvoteします。 –

答えて

0

シナリオでは、同時性ランドにあります。気をつけてください。傷つきやすいです。

1つのアプローチはCountDownLatchを作成し、それをmyMethod、 で待ち、incrementメソッドのラッチをカウントダウンすることです。これは、atimeの1つのスレッドのみが入力される場合にのみ有効です。myMethod

詳細については、CountDownLatchを参照してください。

関連する問題