多线程的 notify()唤醒有时候管用,有时候没用??
问题描述
大概是要做一个线程通信,又一个线程唤醒其他线程,但是有时候能够唤醒,有时候不行??不知道为啥。
相关代码
private static volatile String FENZU = "";
private static final Object object = new Object();
private static volatile boolean flag = true;
// 线程 A:
public void huanXing(HttpServletRequest request, HttpServletResponse response) {
new Thread(new Runnable() {
@Override
public void run() {
//唤醒线程
synchronized(object) {
object.notify();
flag = false;
System.out.println("点击了刷新按钮,开始唤醒线程");
}
}
}).start();
try {
request.getRequestDispatcher("/yuanDanWei/zhuYe").forward(request, response);
} catch (ServletException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
// 线程 B:
if (!"".equals(fenZu) && fenZu != null) {
FENZU = fenZu;
new Thread(new Runnable() {
@Override
public void run() {
synchronized(object) {
try {
while (flag) {
System.out.println("线程进入等待,后续无法执行");
object.wait();
FENZU = "";
System.out.println("线程被唤醒");
}
flag = true;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
你期待的结果是什么?实际看到的错误信息又是什么?
正常情况应该是:
线程B执行的结果:
得到的组别是:资产组
线程进入等待,后续无法执行
线程A执行的结果:
点击了刷新按钮,开始唤醒线程
线程被唤醒
正常情况下,B线程进入等待,A把B唤醒;然后不停的重复;
错误信息现在是:
运行了多次后,出现:
线程A执行的结果:
点击了刷新按钮,开始唤醒线程
只是出现了,线程B没有被唤醒,没有在后台打印出来"线程被唤醒";不知道为啥,开始运行好好的,跑一会就出现上边的问题???谢谢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
notify只能唤醒随机的一个休眠线程,notifyAll可以唤醒所有的。
你这边的线程B可能被调用多次,所以只有某个被唤醒,你试一下notifyAll看看