Javaスレッドがここで時間制限でのみ機能するのはなぜですか?
-
01-10-2019 - |
質問
SCJPのJavaスレッドに精通しようとしているので、質問がありました。
以下の書かれたコードでは、単純に作成しました。一般的なデータストレージ(配列)を備えた2つの実行可能性と同期write()メソッドは、各実行可能(aおよびb)のマークとしてレターを連続的に残してデータで埋めます。 。
コードがラフで、よりよく書かれている可能性があることは知っていますが、スレッドのモラルを探していました。
だから今、私がそれを実行するとき、それは終了することはなく、結果は次のとおりです。
まだいい。 A0。
しかし、待機()を変更すると(100)、0から9に微調整するだけで動作し、正常に終了します。誰かが私のためにその背後にある理由を説明できますか?
ありがとうございました。
public class ArrayThreads {
Object[] array = new Object[10];
boolean isA = true;
int position = 0;
int getIndex(){
return position;
}
class ThreadA implements Runnable{
synchronized void write(String value){
while(!isA){
try {
wait();
} catch (InterruptedException ex) {
System.out.println("An error in" + value);
ex.printStackTrace();
}
}
array[position] = value + position;
System.out.println(array[position]);
position++;
isA = !isA;
notify();
}
public void run() {
while(getIndex()<array.length){
if (getIndex()==9) return;
else
write("A");}
}
}
class ThreadB implements Runnable{
synchronized void write(String value){
while(isA){
try {
wait();
} catch (InterruptedException ex) {
System.out.println("An error in" + value);
ex.printStackTrace();
}
}
array[position] = value + position;
System.out.println(array[position]);
position++;
isA = !isA;
notify();
}
public void run() {
while(getIndex()<array.length){
if (getIndex()==9) return;
else
write("B");}
}
}
public static void main(String[] args){
ArrayThreads threads = new ArrayThreads();
Thread threadA = new Thread(threads.new ThreadA());
Thread threadB = new Thread(threads.new ThreadB());
System.out.println("Still good");
threadB.start();
threadA.start();
}
}
解決
あなたのスレッドはそれぞれ待っていて、別々のオブジェクトに通知しているので、彼らは互いにまったく通信していません。あなたが彼らに効果的にお互いを解放したいなら、彼らは 共有 同期するために監視し、待機し、通知します。
タイムアウトを指定すると、待機コールをスリープコールに効果的に回すため、「動作」しています... 2つのスレッドがまだ個別のモニターを扱っているため、まだ何も待っている/通知していません。
他のヒント
オブジェクトは同じモニターで機能していません。
wait()を移動し、次のようなオブジェクトに通知()を移動する必要があります。http://www.java-samples.com/showtutorial.php?tutorialId=306
または、ターゲットオブジェクトに通知することができます。http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/tij315_016.htm
待機を設定したとき(100)。タイムアウトを設定しています。そして間違いなくそれは100ms後に目覚めます。