スレッドを使用する Java プログラムを作成しようとしています。プログラムの開始時に 3 つのスレッドを実行し、それらを「作業指示書」の ArrayList で待機させたいと考えています。最初は、作業指示はありません。したがって、スレッドはただ待つ必要があります。将来のある時点で、作業命令が ArrayList に追加される予定であり、メイン スレッドは実行すべき作業があることをスレッドに通知する必要があります。
(Runnableを実装する代わりに)Threadを拡張することでそれを実現したいと考えています。
私が抱えている主な問題は、スレッドがworkorders ArrayListと正しく同期されていないことだと思います。
私のコードは次のようになります。
public static void main(String[] args) {
AnotherRunnable anotherRunnable = new AnotherRunnable();
ArrayList<ATMRunnable> workOrders = new ArrayList<ATMRunnable>();
T1 t1 = new T1(anotherRunnable, workOrders);
T1 t2 = new T1(anotherRunnable, workOrders);
t1.start();
t2.start();
try{
Thread.sleep(2000);
}
catch(InterruptedException e){}
synchronized (workOrders){
System.out.println(t1.getState() + " - " + t1.getName());
System.out.println(t2.getState() + " - " + t2.getName());
System.out.println("notify");
workOrders.notify();
System.out.println(t1.getState() + " - " + t1.getName());
System.out.println(t2.getState() + " - " + t2.getName());
}
}
AnotherRunnable クラス:
public class AnotherRunnable implements Runnable {
public void run()
{
System.out.println("AnotherRunnable");
}
}
そしてトレッドクラス:
public class T1 extends Thread {
AnotherRunnable anotherRunnable;
ArrayList<ATMRunnable> workOrders;
ATMThread(AnotherRunnable anotherRunnable, ArrayList<ATMRunnable> workOrders)
{
this.anotherRunnable = anotherRunnable;
this.workOrders = workOrders;
}
public void run()
{
System.out.println("Run Thread");
synchronized (workOrders){
try{
System.out.println("wait Thread");
workOrders.wait();
}
catch (InterruptedException e){}
}
}
}
これはプログラムの出力です:
Run Thread
wait Thread
Run Thread
wait Thread
WAITING - Thread-1
WAITING - Thread-2
notify all
BLOCKED - Thread-1
WAITING - Thread-2
ご覧のとおり、最初のスレッドの状態は、workOrders オブジェクトでの通知の呼び出しの後、Blocked に変更されます。ただし、スレッドも実行可能なオブジェクトも実行されません。
どんな助けでも大歓迎です。