Executor 的线程池计数是否会影响给定主任务的子任务?
Does Executor's threadpool count affect sub tasks given main task?
假设我有一个 executor
初始化如下:
ExecutorService es = Executors.newFixedThreadPool(2);
然后我有一个主线程,它将由上面的 executor
服务 es
执行。该主线程调用另一个子线程,如下所示:
Thread mainThread = new Thread(new Runnable() {
@Override
public void run() {
Thread sub1 = new Thread(new Runnable() {
@Override
public void run() {
}
});
Thread sub2 = new Thread(new Runnable() {
@Override
public void run() {
}
});
Thread sub3 = new Thread(new Runnable() {
@Override
public void run() {
}
});
Thread sub4 = new Thread(new Runnable() {
@Override
public void run() {
}
});
sub1.start();
sub2.start();
sub3.start();
sub4.start();
}
});
es.submit(mainThread);
subTasks
会因为主线程控制器执行器服务 线程池 计数而被性能墙击中吗?因为我指定线程池为 2 但我正在调用 4 个子线程。即使我的主线程 es.submits
是 1 小于 2?
没有。线程池只关心您提交到池中的任务。如果这些任务创建线程或您以其他方式创建线程,则该池不会知道或关心它们。
我希望你不打算编写问题中显示的代码。
由您提交的线程生成的线程不受执行程序限制的影响。
这是一个更简单但丑陋的实验。
// notice only 1 thread in pool here
ExecutorService es = Executors.newFixedThreadPool(1);
Thread mainThread = new Thread(new Runnable() {
@Override
public void run() {
Thread sub1 = new Thread(new Runnable() {
@Override
public void run() {
Thread.getAllStackTraces().keySet().forEach(
t -> System.out.println(t.getName())
);
}
});
sub1.setName("sub1");
try {
sub1.start();
sub1.join();
System.out.println("mainThread done");
}
// swallowing
catch (InterruptedException ie) {}
}
});
try {
es.submit(mainThread);
}
finally {
es.shutdown();
}
输出(类似...)
Reference Handler
Finalizer
DestroyJavaVM
sub1
pool-1-thread-1
Signal Dispatcher
mainThread done
注意到我将池中的最大线程数更改为 1
。
这里发生的是你的 mainThread
生成 sub1
并等待它完成,然后打印 mainThread done
。
sub1
打印在其自身执行期间当前处于活动状态的所有线程名称,而 mainThread
正在等待。
这意味着您有两个自定义线程 运行:mainThread
和 sub1
。
假设我有一个 executor
初始化如下:
ExecutorService es = Executors.newFixedThreadPool(2);
然后我有一个主线程,它将由上面的 executor
服务 es
执行。该主线程调用另一个子线程,如下所示:
Thread mainThread = new Thread(new Runnable() {
@Override
public void run() {
Thread sub1 = new Thread(new Runnable() {
@Override
public void run() {
}
});
Thread sub2 = new Thread(new Runnable() {
@Override
public void run() {
}
});
Thread sub3 = new Thread(new Runnable() {
@Override
public void run() {
}
});
Thread sub4 = new Thread(new Runnable() {
@Override
public void run() {
}
});
sub1.start();
sub2.start();
sub3.start();
sub4.start();
}
});
es.submit(mainThread);
subTasks
会因为主线程控制器执行器服务 线程池 计数而被性能墙击中吗?因为我指定线程池为 2 但我正在调用 4 个子线程。即使我的主线程 es.submits
是 1 小于 2?
没有。线程池只关心您提交到池中的任务。如果这些任务创建线程或您以其他方式创建线程,则该池不会知道或关心它们。
我希望你不打算编写问题中显示的代码。
由您提交的线程生成的线程不受执行程序限制的影响。
这是一个更简单但丑陋的实验。
// notice only 1 thread in pool here
ExecutorService es = Executors.newFixedThreadPool(1);
Thread mainThread = new Thread(new Runnable() {
@Override
public void run() {
Thread sub1 = new Thread(new Runnable() {
@Override
public void run() {
Thread.getAllStackTraces().keySet().forEach(
t -> System.out.println(t.getName())
);
}
});
sub1.setName("sub1");
try {
sub1.start();
sub1.join();
System.out.println("mainThread done");
}
// swallowing
catch (InterruptedException ie) {}
}
});
try {
es.submit(mainThread);
}
finally {
es.shutdown();
}
输出(类似...)
Reference Handler
Finalizer
DestroyJavaVM
sub1
pool-1-thread-1
Signal Dispatcher
mainThread done
注意到我将池中的最大线程数更改为 1
。
这里发生的是你的 mainThread
生成 sub1
并等待它完成,然后打印 mainThread done
。
sub1
打印在其自身执行期间当前处于活动状态的所有线程名称,而 mainThread
正在等待。
这意味着您有两个自定义线程 运行:mainThread
和 sub1
。