私はマルチスレッドに慣れていません。マルチスレッドについては読んでいますが、この複雑なマルチスレッドコードを書いて次のことを行うと思います。スレッド1からスレッド2によって通知されるまで待つ方法
私のカウンタークラスは以下の通りです。
class Counter {
private int c = 0;
public void increment() {
System.out.println("increment value: "+c);
c++;
}
public void decrement() {
c--;
System.out.println("decrement value: "+c);
}
public int value() {
return c;
}
}
このカウンタオブジェクトは2つのスレッド間で共有されます。 スレッドが開始されたら、私は次のことを行う必要があります。 Thread1がCounterオブジェクトのカウントを1だけインクリメントするまでThread2を待機させます。 これが完了すると、Thread1はthread2に通知し、Thread1はthread2の待機を開始して値を1減らします。 次にthread2が値を開始し、 1を返し、thread1に再度通知し、thread2はthread1の待機を開始します。このプロセスを数回繰り返します。
これをどうすれば実現できますか?事前に多くの感謝。
私は以下を行っています。
public class ConcurrencyExample {
private static Counter counter;
private static DecrementCount t1;
private static IncrementCount t2;
public static void main(String[] args) {
Counter counter = new Counter();
Thread t1 = new Thread(new IncrementCount(counter));
t1.start();
Thread t2 = new Thread(new DecrementCount(counter));
t2.start();
}
}
public class DecrementCount implements Runnable {
private static Counter counter;
public DecrementCount(Counter counter) {
this.counter = counter;
}
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
counter.decrement();
System.out.println("decreamented");
}
}
}
public class IncrementCount implements Runnable {
private static Counter counter;
public IncrementCount(Counter counter) {
this.counter = counter;
}
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
counter.increment();
System.out.println("Incremented");
}
}
}
CountDownLatchを参照してください。http://docs.oracle.com/javase/1.5.0/docs/apc/java/util/concurrent/CountDownLatch.html – davidmontoyago
IncrementCountは、 'increment()'を呼び出す必要があります。 –
これを行う最も簡単な方法は、1つのスレッドを使用することです。私は、複数のスレッドを使用するほうが複雑で遅くなるのではなく、高速になる例を考えることをお勧めします。 –