当前位置: 首页 > 面试题库 >

在调用notifyAll之前获取所有等待对象的线程

叶炜
2023-03-14
问题内容

我有很多代码,
调用时处理器很小,notifyAll有时会导致性能问题(100毫秒),因此我想知道当前等待对象释放的线程是什么。

synchronized (obj){
//do some stuff..
obj.notifyall();
}

我想在调用之前打印所有等待对象释放的线程 obj.notifyAll()


问题答案:

是否所有线程都在资源上等待相同的条件?如果是,则可以尝试替换obj.notify()obj.notifyAll尽管实际上不建议这样做。AFAIK,无法“检索”在给定对象上等待的所有线程的列表(尽管您可以通过编程方式获取进程的线程转储并查看线程,但是我敢肯定那不是您拥有的)心神)。即使存在,列出线程然后对它们执行“操作”也肯定会比花费时间更多notifyAll

另外,如果“处理器很小”,请尝试限制产生的线程数,因为如果没有大量的“实际”线程,创建太多线程通常是一项开销。这样,notifyAll就不会唤醒大量线程。

这是一个小程序,它演示了内联注释的线程状态信息的转储:

package net.sanjayts.test;

import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
import java.util.concurrent.TimeUnit;

public class ThreadDumpTest {

    public static void main(String[] args) throws Exception {
        final Object lock = new Object();
        for (int i = 0; i < 6; ++i) {
            final int cnt = i;
            new DaemonThread(new Runnable() {
                @Override
                public void run() {
                    try {
                        // If counter is even, try to acquire common lock and then
                        // sleep. If odd, sleep without trying to acquire the lock.
                        // This way, if we do a thread dump, we'll see threads in
                        // different states (TIMED_WAIT for those sleeping threads
                        // and BLOCKED for those waiting for the common "lock".
                        if (cnt % 2 == 0) {
                            synchronized (lock) {
                                TimeUnit.MINUTES.sleep(1); // sleep 1 min
                            }
                        } else {
                            TimeUnit.MINUTES.sleep(1); // sleep 1 min
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }, "mythread-" + cnt).start();
        }
        ThreadInfo[] infos = ManagementFactory.
                getThreadMXBean().dumpAllThreads(true, true);
        for (ThreadInfo info : infos) {
            System.out.println(info);
            System.out.println("===========================");
        }
        TimeUnit.SECONDS.sleep(2);
    }

}

class DaemonThread extends Thread {
    public DaemonThread(Runnable r, String name) {
        super(r, name);
        setDaemon(true);
    }
}


 类似资料:
  • 问题内容: 我想要一个布尔值来通知系统的某些部分特定服务已启动。 由于某些奇怪的原因,我得到了错误。 奇怪的是notifyAll()在一个同步块内,该块控制着我调用notifyAll()的对象。 我的课是这样开始的: 我正在开发一个android应用程序。我认为它不会影响任何事情,但是我会在注释中补充这个问题,以防影响Java的工作方式。 如果对象锁定在同步块中,为什么会出现异常? 问题答案: 线

  • 考虑以下代码 结果如下: notifyAll()在13毫秒时被调用。但是,控件仅在10016毫秒时退出等待()。 从上面给出的代码中可以看出,在进行了通知()调用之后,等待()调用似乎没有立即结束。 但是,包括Java API在内的所有文档都指定,调用wait()的方法应该在notify()调用之后立即获得锁。 如果在调用通知()时等待()不会结束,那么对通知()的需求就会变得无效,因为即使没有调

  • 我想在C#中处理子目录和文件的文件系统/文件夹。我正在使用TPL库中的任务。这个想法是递归地执行它并为每个文件夹创建一个任务。主线程应该等待子线程完成,然后打印一些信息。事实上我只是想知道扫描何时完成。我已经开始使用线程池,然后切换到TLP。做了一些简单的例子。经过一些尝试从简单的代码到越来越臃肿的代码我被困在这里: 主线程有时仍然过早地继续,而不是在完成所有其他线程之后继续。(我对C#比较陌生,

  • 我正在使用Spring Webflow R2DBC将一些数据插入数据库。 要求提供数据- 控制器 服务 道 主要问题是我不知道如何让它等待所有结果返回并添加到最终

  • 本文向大家介绍Java多线程基础 线程的等待与唤醒(wait、notify、notifyAll),包括了Java多线程基础 线程的等待与唤醒(wait、notify、notifyAll)的使用技巧和注意事项,需要的朋友参考一下 本篇我们来研究一下 wait() notify() notifyAll() 。 DEMO1: wait() 与 notify() DEMO1 输出: 注意: 使用 wait

  • 这可能是在类似的背景下问的,但我在搜索了大约20分钟后找不到答案,所以我会问。 我已经编写了一个Python脚本(比如说:scriptA.py)和一个脚本(比如说scriptB.py) 在scriptB中,我想用不同的参数多次调用scriptA,每次运行大约需要一个小时,(这是一个巨大的脚本,做了很多事情……不用担心),我希望能够同时使用所有不同的参数运行scriptA,但我需要等到所有参数都完成