Java 正在运行的线程数
我对下面的代码很好奇。假设我有一个main()方法运行下面的代码。使用下面的代码可以运行的最大线程数是多少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
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