そこで、次の出力を出力するプログラムを作成しようとしています。
44
33
22
11
プログラムはマルチスレッドであると想定されており、競合状態を防ぐためにロックを使用する必要があります。また、スレッドが出力したい番号が変数 threadnum (出力する必要がある次の番号) と一致しない場合に待機する必要があるように、Condition を使用する必要があります。実行しようとすると IllegalMonitorStateExceptions が発生することを除いて、ほとんどのことがわかりました。何が原因で、どのように修正するのかわかりません。助けていただければ幸いです。前もって感謝します。
public class Threadlocksrev implements Runnable {
Lock lock = new ReentrantLock();
Condition wrongNumber = lock.newCondition();
int i;
static int threadnum = 4;
public Threadlocksrev(int i){
this.i = i;
}
private int getI(){
return i;
}
@Override
public synchronized void run() {
lock.lock();
while(true){
if (threadnum == i){
try{
System.out.print(getI());
System.out.print(getI());
System.out.print("\n");
threadnum--;
wrongNumber.signalAll();
}
catch(Exception e){
e.printStackTrace();
}
finally{
lock.unlock();
}
}
else{
try {
wrongNumber.await();
}
catch (InterruptedException e) {
e.printStackTrace();
}
finally{
wrongNumber.signalAll();
lock.unlock();
}
}
}
}
}
メインクラス:
public class ThreadlocksrevInit {
private static final int max_threads = 4;
public static void main(String[] args) {
Threadlocksrev task1 = new Threadlocksrev(1);
Threadlocksrev task2 = new Threadlocksrev(2);
Threadlocksrev task3 = new Threadlocksrev(3);
Threadlocksrev task4 = new Threadlocksrev(4);
Thread thread1 = new Thread(task1);
Thread thread2 = new Thread(task2);
Thread thread3 = new Thread(task3);
Thread thread4 = new Thread(task4);
thread1.start();
thread2.start();
thread3.start();
thread4.start();
}
}