我很好奇以下代码。假设我有一个运行下面代码的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个线程?
答案 0 :(得分:4)
根据官方documentation的说法。
如果在所有线程都处于活动状态时提交了其他任务,则会执行 将在队列中等待,直到线程可用。如果有任何线程 由于在关机之前执行期间的故障而终止,这是一个新的 如果需要执行后续任务,将取代它。该 池中的线程将一直存在,直到明确关闭为止。
答案 1 :(得分:1)
在这里,您提交了5次,但您只修复了3个帖子,这将超过您提交的5个任务
很好地演绎了@James Jithin, 你有其他的支持/帮助线程除了你的工作线程之外还有自己的任务,你可以分配一些任务而这些线程只能负责分配任务其他managmnet其他任务将是assigne to helper / support internal线程。
正如@James所述,其他恶魔线程的内部任务如下:
附加侦听器:动态附加在目标JVM中具有附加侦听器线程。这是第一个附加请求发生时启动的线程。
信号调度程序当操作系统向JVM发出信号时,信号调度程序线程会将信号传递给相应的处理程序。
引用处理程序:用于将待处理引用排入队列的高优先级线程。 GC创建一个简单的链接引用列表,需要进行处理,并且该线程会快速将它们添加到正确的队列中,并通知ReferenceQueue侦听器。
终结器: Finalizer线程调用终结器方法。
答案 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。