Java 在调用wait和notify之后,我尝试从主线程连接两个线程

Java 在调用wait和notify之后,我尝试从主线程连接两个线程,java,multithreading,Java,Multithreading,首先,我尝试定义一个包含2个同步方法的类,第一个包含wait()调用,第二个包含notify()调用 然后我尝试在主线程中创建两个线程,第一个线程调用Xa类的一个对象的printX()方法,第二个线程调用同一个对象的notifyX()方法,最后主线程连接两个线程 我用for循环重复这个场景 public class TryQ { public static void main(String[] args) { // TODO Auto-generated method stub

首先,我尝试定义一个包含2个同步方法的类,第一个包含wait()调用,第二个包含notify()调用

然后我尝试在主线程中创建两个线程,第一个线程调用Xa类的一个对象的printX()方法,第二个线程调用同一个对象的notifyX()方法,最后主线程连接两个线程

我用for循环重复这个场景

public class TryQ {

public static void main(String[] args) {
    // TODO Auto-generated method stub

    Thread t1 = null;
    Thread t2 = null;
    for(int i=1 ; i<=100; i++) {
        Xa x = new Xa();

        t1 = new Thread() {
            @Override
            public void run() {
                x.printX();
            }
        };

        t2 = new Thread() {
            @Override
            public void run() {
                x.notifyX();
            }
        };

        t1.start();
        t2.start();

        try {
            t1.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            t2.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }       
}
}
公共类TryQ{
公共静态void main(字符串[]args){
//TODO自动生成的方法存根
线程t1=null;
线程t2=null;

对于(int i=1;i,无论是否使用
join
,都存在问题

问题是,如果
t2
首先执行
notifyX

public synchronized void notifyX() {
    System.out.println("111");
    notify();
}
然后
t1
调用
printX
t1
将永远被阻塞

public synchronized void printX() {
    try {
        wait();   <--- since t2 has finished, t1 will get stuck here!
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println("XXX");
}
public synchronized void printX(){
试一试{

wait();
join()
方法用于等待此线程死亡,因此主线程停止运行。似乎程序是否完成几乎是一个机会问题,加入或不加入。如果t2恰好在t1之前运行,则t1永远不会完成。这不是使用等待的方式。一旦您完成了这些谜题,请以此为例说明为什么使用
等待
notify
是一种不好的做法。@chrylis与please类似?
wait()
notify()
是低级原语,可以用来实现您自己的“更好的并发实用程序”如果标准库还没有提供适合您的东西。但是这种情况不应该经常发生,因为您可以通过
java.util.concurrent
包中的阻塞队列、障碍、信号量和其他功能做很多事情。是的,这就是典型的答案
public synchronized void printX() {
    try {
        wait();   <--- since t2 has finished, t1 will get stuck here!
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println("XXX");
}