我正在尝试使用 2 个线程。 1 个线程仅打印奇数,另一个线程仅打印偶数,这必须是替代操作。
例如:
Thread1 1
Thread2 2
Thread1 3
Thread2 4
and so on..
下面是程序,请告诉我哪里出了问题,因为即使线程2通知它,线程1也没有退出等待状态..
public class ThreadInteraction {
public static void main(String[] args) {
new ThreadInteraction().test();
}
private void test() {
ThreadA ta = new ThreadA();
Thread t = new Thread(ta);
t.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
for(int i=2;i<=50;){
System.out.println("Thread2 "+i);
synchronized (t) {
try {
t.notify();
t.wait();
} catch (Exception e) {
e.printStackTrace();
}
}
i=i+2;
}
}
}
class ThreadA implements Runnable{
@Override
public void run() {
for(int i=1;i<50;){
System.out.println("Thread1 "+i);
synchronized (this) {
try {
notify();
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
i=i+2;
}
}
}
最佳答案
问题是,在一种情况下,您正在锁定 Thread t
[synchronized (t) ],而在另一种情况下,您正在锁定 TheadA
对象本身 [synchronized (这个)]。
如果您希望线程彼此通信,那么两个线程都应该锁定同一个对象,然后等待通知才会按您的预期工作。
编辑:
您的程序中还有另一个问题,您没有使用任何变量在两个线程之间进行协调。所以你可能会看到像这样的输出 2,1,4,3...等等。要点是线程将交替工作,但不是按顺序工作。 因此,您应该在两个线程之间共享一个变量,该变量应该递增。 第二个问题是您没有处理虚假的唤醒调用[阅读一些有关此的文档],您应该始终在 while 循环内调用 wait。
关于java - 通知不让线程脱离等待状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19206387/