假设我有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?
答案 0 :(得分:1)
没有。线程池只关心您提交到池中的任务。如果这些任务创建线程或您以其他方式创建线程,则该池将不知道或不关心它们。
我希望您不打算编写问题中显示的代码。
答案 1 :(得分:0)
由提交的线程生成的线程不受执行程序限制的影响。
这是一个更简单但又丑陋的实验。
// 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
。