Java 正在运行的线程数

Java 正在运行的线程数,java,executorservice,Java,Executorservice,我对下面的代码很好奇。假设我有一个main()方法运行下面的代码。使用下面的代码可以运行的最大线程数是多少 ExecutorService ex= Executors.newFixedThreadPool(3); for(int i = 1; i <= 5; i++) { RunnableTask task = new RunnableTask(i, 3); ex.submit(task); } ExecutorServ

我对下面的代码很好奇。假设我有一个main()方法运行下面的代码。使用下面的代码可以运行的最大线程数是多少

ExecutorService ex= Executors.newFixedThreadPool(3);
 for(int i = 1; i <= 5; i++) {
            RunnableTask task = new RunnableTask(i, 3);
            ex.submit(task);
        } 
ExecutorService ex=Executors.newFixedThreadPool(3);

对于(inti=1;i这里您提交了5次,但您只有固定的3个线程,将超过您提交的5个任务

由@James Jithin充分证明, 防御方面,您有其他支持/帮助线程,除了您的工作线程之外,还有自己的任务,您将向工作线程分配一些任务,这些线程只负责执行分配的任务,其他管理网其他任务将分配给帮助/支持内部线程

正如@James演示的,其他恶魔线程的内部任务如下:

  • 附加侦听器:动态附加在目标JVM中有一个附加侦听器线程。该线程在第一个附加请求发生时启动

  • 信号调度器:当操作系统向JVM发出信号时,信号调度器线程将把信号传递给相应的处理程序

  • 引用处理程序:将挂起的引用排入队列的高优先级线程。GC创建一个需要处理的引用的简单链接列表,该线程快速将它们添加到适当的队列中,并通知ReferenceQueue侦听器

  • 终结器:终结器线程调用终结器方法

  • main:它必须是完成执行的最后一个线程。当主线程停止时,程序终止
  • 据官方称

    如果在所有线程都处于活动状态时提交其他任务,则 将在队列中等待,直到有线程可用。如果有线程 在关机前的执行过程中,由于故障而终止,新的 如果需要执行后续任务,一个将取代它 在池显式关闭之前,池中的线程将一直存在

    让我们想想:

    public static void main(String[] args) {
        class RunnableTask implements Runnable {
            public RunnableTask(int i, int j) {
            }
    
            @Override
            public void run() {
                try {
                    Thread.sleep(1000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    
        ExecutorService ex = Executors.newFixedThreadPool(3);
        for (int i = 1; i <= 5; i++) {
            RunnableTask task = new RunnableTask(i, 3);
            ex.submit(task);
        }
    
        ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
        System.out.println(threadMXBean.getThreadCount());
    
        long[] tIds = threadMXBean.getAllThreadIds();
        for (long tId : tIds) {
            System.out.println(threadMXBean.getThreadInfo(tId).getThreadName());
        }
    
        ex.shutdown();
    }
    

    工作线程的数量将是3,因为您定义了一个固定的线程池。

    是的,所以一次可以运行的最大线程数应该是4,对吗?因为main()也将有一个线程在运行。从逻辑上讲,您将在线程池中生成3个线程。您提交的另外2个线程将等待前3个线程中的一个停止。
    8
    pool-1-thread-3
    pool-1-thread-2
    pool-1-thread-1
    Attach Listener
    Signal Dispatcher
    Finalizer
    Reference Handler
    main