(初心者警告)同じクラスの別のメソッドがクラス変数の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がサーバーからの応答を受信してからずっとずっとタイムアウトするまで実行されます。誰も私の方法のエラーを私に見せてもらえますか?
問題をコンパイルして示すコードを投稿してください。 a [mcve]。質問のコードはコンパイルされません。なぜなら、呼び出すことなく関数を参照した場所の少なくとも数箇所、囲みメソッドなどを持たないクラス本体にステップバイステップのコードが書かれているからです。 –
基本的に: 'incrementM'または' incrementB'が 'myMethod'が実行されている間に別のスレッドによって呼び出されると、' myMethod'は最終的に値の変化を見るでしょう。 'counterA'と' counterB'を 'volatile'にすると、' myMethod'はそれらの変更を直ちに見るようになります。 –
@ T.J.Crowder答えとして書くと、私はそれをupvoteします。 –