关于多线程中wait()和notifyAll()的问题

[复制链接]
查看11 | 回复3 | 2021-1-27 06:32:09 | 显示全部楼层 |阅读模式
classTaskOneimplementsRunnable{
publicvoidrun(){
System.out.println("TaskOnestart!");
System.out.println("TaskOnesuspend");
try{
synchronized(this){
wait();
}
}catch(InterruptedExceptione){
System.out.println(e);
}
System.out.println("TaskOnecontinue");
System.out.println("TaskOneended!");
}
}
classTaskTwoimplementsRunnable{
privateTaskOnetaskOne;
publicTaskTwo(TaskOnet){
taskOne=t;
}
publicvoidrun(){
synchronized(taskOne){
System.out.println("TaskTwostart!");
System.out.println("3seconds");
try{
TimeUnit.SECONDS.sleep(3);
}catch(InterruptedExceptione){
System.out.println(e);
}
System.out.println("notifyAll()");
taskOne.notifyAll();
System.out.println("TaskTwoended!");
}
}
}
classTestSynchronizition{
publicstaticvoidmain(String[]args){
TaskOnetaskOne=newTaskOne();
TaskTwotaskTwo=newTaskTwo(taskOne);
ExecutorServiceexec=Executors.newCachedThreadPool();
exec.execute(taskOne);
exec.execute(taskTwo);
try{
exec.awaitTermination(3000,TimeUnit.MILLISECONDS);
}catch(InterruptedExceptione){
System.out.println(e);
}
}
}
程序运行结果如下:

taskOne对应的线程在notifyAll()以后并没有被唤醒。请问如何修改程序可以让taskOne线程打印出最后两句话?
分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:32:09 | 显示全部楼层
可以在TaskOne中定义一个布尔型的标志flag指定哪个线程执行。。。。
回复

使用道具 举报

千问 | 2021-1-27 06:32:09 | 显示全部楼层
你打印一下TaskOne中的this对象,再打印一下taskTwo中的taskOne,就知道原因了
回复

使用道具 举报

千问 | 2021-1-27 06:32:09 | 显示全部楼层
你的程序有问题。
TaskOne,TaskTwo都锁住同一个对象。如果TaskTwo先运行,那么TaskOne只能一直等待了,直到TaskTwo结束。
TaskTwo既然结束了,那么TaskOne就不会被唤醒。
你要保证TaskOne先运行,才能达到你要的效果。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行