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

发布于 2022-09-12 23:09:37 字数 1864 浏览 14 评论 0

问题描述

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

相关代码

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦里的微风 2022-09-19 23:09:37

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文