多线程的 notify()唤醒有时候管用,有时候没用??

最忙碌的语言
  • 23

问题描述

大概是要做一个线程通信,又一个线程唤醒其他线程,但是有时候能够唤醒,有时候不行??不知道为啥。

相关代码

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没有被唤醒,没有在后台打印出来"线程被唤醒";不知道为啥,开始运行好好的,跑一会就出现上边的问题???谢谢

回复
阅读 136
2 个回答
✓ 已被采纳

notify只能唤醒随机的一个休眠线程,notifyAll可以唤醒所有的。
你这边的线程B可能被调用多次,所以只有某个被唤醒,你试一下notifyAll看看

最好不要用 notify,使用 CountDownLatch

你知道吗?

宣传栏