私はマルチスレッドに不慣れで、マルチスレッドについて読んでいるときに、次のことを行うためにこの派手なマルチスレッドコードを書くことを考えました。
私のカウンタークラスは以下の通りです。
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;
}
}
このCounterオブジェクトは、2つのスレッド間で共有されます。スレッドが開始されたら、次のことを行う必要があります。Thread1がCounterオブジェクトのカウントを1インクリメントするまで、Thread2を待機させます。これが完了すると、Thread 1はthread2に通知し、Thread1はthread2が値を1デクリメントするのを待機し始めます。次にthread2が開始し、値を1デクリメントします。スレッド1に再度通知し、スレッド2はスレッド1の待機を開始します。このプロセスを数回繰り返します。
どうすればこれを達成できますか。よろしくお願いします。
私は次のことをしました。
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");
}
}
}