0
私のプログラムでは、スレッドT1は新しいスレッドT2を生成し、そのスレッド(すなわちT2.join)に対してjoinを呼び出し、この新たに生成されたスレッドT2はT1(すなわちT1.join)でjoinを呼び出します。これはスレッドのブロックを引き起こしています。どのようにこれを克服することができます。 私のプログラムJavaスレッド参加メソッド
public class PositiveNegativeNumberProducerV1 {
static Thread evenThread, oddThread;
public static void main(String[] args) {
oddThread = new Thread(new OddProducer(evenThread), "oddThread");
oddThread.start();
}
}
class EvenProducer implements Runnable {
Thread t;
EvenProducer(Thread t) {
this.t= t;
}
public void run() {
for(int i=1; i<=100; i++) {
if(i%2==0) {
System.out.println("i = "+i+":"+Thread.currentThread().getName());
try {
System.out.println("Now join will be called on "+t.getName()+" by thread "+Thread.currentThread().getName());
t.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
class OddProducer implements Runnable {
Thread t;
OddProducer(Thread t) {
this.t= t;
}
public void run() {
for(int i=1; i<=100; i++) {
if(i%2!=0) {
System.out.println("i = "+i+":"+Thread.currentThread().getName());
try {
if(t==null) {
t = new Thread(new EvenProducer(PositiveNegativeNumberProducerV1.oddThread), "evenThread");
t.start();
}
if(t.isAlive()) {
System.out.println("evenThread is alive and join will be called on "+t.getName()+" by thread "+Thread.currentThread().getName());
t.join();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
これを行わないでください。それはあなたがそれを克服する方法です。 2人が同じドアを歩きたいと想像してみてください。それぞれが自分自身を通過する前に相手が歩き回るのを待つ - これはデッドロックの定義です。 –
あなたの文に動詞がないボリス。 – GhostCat
@GhostCat動詞は敗者のためのものです。 Appleの自動修正に少なくとも従ってください。 –