在我的主线程中,我创建并启动了四个线程(A,B,C,D
),它们每隔500到1000ms在控制台上打印字母和数字。 例如A1,A2,A3
等如何使随机线程等待,然后在恒定时间后唤醒
主线程假设暂停随机Letter
线程每隔100ms然后唤醒它。 2秒后,它假设全部杀死它们。
我的问题是,我不能暂停随机Letter
线程将唤醒它,因为我得到:IllegalMonitorStateException
我的主线程类:
public class Main extends Thread {
private boolean alive;
private ArrayList<Letter> letters;
private Letter toStop;
public static Object mutex;
public Main() {
letters = new ArrayList<Letter>();
alive = true;
mutex = new Object();
}
public void run() {
try {
Timer timer = new Timer();
timer.schedule(new StopTask(timer, this), 2 * 1000);
letters.add(new Letter());
letters.add(new Letter());
letters.add(new Letter());
letters.add(new Letter());
for (Letter letter : letters) {
new Thread(letter).start();
}
while (alive) {
synchronized (mutex) {
toStop = letters.get((int) (Math.random() * letters.size()));
System.out.println(toStop.getLetter() + " spi");
mutex.wait();
Thread.sleep(100);
mutex.notify();
}
for (Letter letter : letters) {
letter.kill();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void kill() {
alive = false;
}
}
和我Letter
类:
class Letter implements Runnable {
private static int ID;
private char letter;
private int counter;
private boolean alive;
public Letter() {
letter = (char) ('A' + ID);
alive = true;
ID++;
}
@Override
public void run() {
try {
while (alive) {
System.out.println(letter + "" + counter);
counter++;
Thread.sleep((int) (Math.random() * 501 + 500));
}
System.out.println("Watek " + letter + " sie zakonczyl");
} catch (Exception e) {
}
}
public void kill() {
alive = false;
}
public char getLetter() {
return letter;
}
}
StopTask
:
import java.util.Timer;
import java.util.TimerTask;
public class StopTask extends TimerTask {
private Timer timer;
private Main main;
public StopTask(Timer timer, Main main) {
this.timer = timer;
this.main = main;
}
public void run() {
System.out.println("Time's up!");
main.kill();
timer.cancel(); //Not necessary because we call System.exit
}
}
您正在同步'mutex'并在'toStop'上调用'wait()'。你应该调用'mutex.wait()'而不是 –
@NitinDandriyal,但我想暂停'toStop'直到我调用notify。 – Yoda
@NitinDandriyal我更新'Main'中的'run'线程永远不会结束。我现在添加了'StopTask',复制的代码将被编译并运行。 – Yoda