Java 在调用wait和notify之后,我尝试从主线程连接两个线程
首先,我尝试定义一个包含2个同步方法的类,第一个包含wait()调用,第二个包含notify()调用 然后我尝试在主线程中创建两个线程,第一个线程调用Xa类的一个对象的printX()方法,第二个线程调用同一个对象的notifyX()方法,最后主线程连接两个线程 我用for循环重复这个场景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
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永远不会完成。这不是使用等待的方式。一旦您完成了这些谜题,请以此为例说明为什么使用等待当更好的并发实用程序现在可用时,code>和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");
}