运行的线程数

时间:2017-04-17 12:48:05

标签: java executorservice

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

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

答案是4吗?因为我有一个主线程与另外3个线程,因为ExecutorService只允许运行最多3个线程?

3 个答案:

答案 0 :(得分:4)

根据官方documentation的说法。

  

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

答案 1 :(得分:1)

在这里,您提交了5次,但您只修复了3个帖子,这将超过您提交的5个任务

很好地演绎了@James Jithin, 你有其他的支持/帮助线程除了你的工作线程之外还有自己的任务,你可以分配一些任务而这些线程只能负责分配任务其他managmnet其他任务将是assigne to helper / support internal线程。

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

  1. 附加侦听器:动态附加在目标JVM中具有附加侦听器线程。这是第一个附加请求发生时启动的线程。

  2. 信号调度程序当操作系统向JVM发出信号时,信号调度程序线程会将信号传递给相应的处理程序。

  3. 引用处理程序:用于将待处理引用排入队列的高优先级线程。 GC创建一个简单的链接引用列表,需要进行处理,并且该线程会快速将它们添加到正确的队列中,并通知ReferenceQueue侦听器。

  4. 终结器: Finalizer线程调用终结器方法。

  5. main:它必须是完成执行的最后一个线程。当主线程停止时,程序终止。

答案 2 :(得分:1)

让我们弄明白:

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();
}

我的输出:

8
pool-1-thread-3
pool-1-thread-2
pool-1-thread-1
Attach Listener
Signal Dispatcher
Finalizer
Reference Handler
main

当您定义了固定的线程池时,工作线程的数量将为3。