Java 执行人';s线程池计数是否影响给定主任务的子任务?
假设我有一个Java 执行人';s线程池计数是否影响给定主任务的子任务?,java,multithreading,executorservice,threadpoolexecutor,Java,Multithreading,Executorservice,Threadpoolexecutor,假设我有一个执行器,其初始化如下: ExecutorService es = Executors.newFixedThreadPool(2); 然后我有一个主线程,它将由上面的executorservicees执行。主线程调用另一个子线程,如下所示: Thread mainThread = new Thread(new Runnable() { @Override public void run() {
执行器
,其初始化如下:
ExecutorService es = Executors.newFixedThreadPool(2);
然后我有一个主线程,它将由上面的executor
servicees
执行。主线程调用另一个子线程,如下所示:
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);
由于主线程控制器执行器服务线程池计数,
子任务是否会被性能墙击中?因为我将线程池指定为2,但我正在调用4个子线程。即使是我提交的主线程es.submitted
也是小于2的1?否。线程池只关心您提交到池中的任务。如果这些任务创建线程,或者您以其他方式创建线程,该池将不知道或不关心它们
我希望您不打算编写问题中所示的代码。提交的线程生成的线程不受执行器限制的影响
这是一个简单但丑陋的实验
// 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();
}
输出(类似于…)
注意到我将池中的最大线程数更改为1
这里发生的是,您的mainThread
生成sub1
并等待其完成,然后打印mainThread done
sub1
在自身执行期间打印当前活动的所有线程名称,而mainThread
正在等待
这意味着您有两个自定义线程正在运行:mainThread
和sub1
谢谢。。那么OS/JVM将利用内核来完成子任务?或者我们可以说,它将继续执行它通常对线程执行的操作。是的,在您的示例中,线程池基本上与代码无关。您可以调用mainThread.start()
,实际上也是一样的。那么“newSingleThreadScheduledExecutor();”的意义是什么呢?它仅用于将来的类使用?当您只需要一个额外的线程来运行异步操作时,它是一种方便的方法。通常,人们使用线程池来获得更高的性能。创建新线程并执行子任务似乎与最初的意图相反
Reference Handler
Finalizer
DestroyJavaVM
sub1
pool-1-thread-1
Signal Dispatcher
mainThread done