Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:ExecutorService的效率低于手动线程执行?_Java_Multithreading_Performance - Fatal编程技术网

Java:ExecutorService的效率低于手动线程执行?

Java:ExecutorService的效率低于手动线程执行?,java,multithreading,performance,Java,Multithreading,Performance,我有一个多线程应用程序。当使用Thread.start()手动启动线程时,每个并发线程使用的CPU正好是25%(或者正好是一个内核-这是在四核机器上)。所以,如果我运行两个线程,CPU使用率正好是50% 然而,当使用ExecutorService运行线程时,似乎有一个“幽灵”线程在消耗CPU资源!一个线程使用50%而不是25%,两个线程使用75%,等等 这可能是某种windows任务管理器人工制品吗 Excutor服务代码为 ExecutorService executor = Executor

我有一个多线程应用程序。当使用Thread.start()手动启动线程时,每个并发线程使用的CPU正好是25%(或者正好是一个内核-这是在四核机器上)。所以,如果我运行两个线程,CPU使用率正好是50%

然而,当使用ExecutorService运行线程时,似乎有一个“幽灵”线程在消耗CPU资源!一个线程使用50%而不是25%,两个线程使用75%,等等

这可能是某种windows任务管理器人工制品吗

Excutor服务代码为

ExecutorService executor = Executors.newFixedThreadPool(threadAmount);

for (int i = 1; i < 50; i++) {
    Runnable worker = new ActualThread(i);
    executor.execute(worker);
}
executor.shutdown();
while (!executor.isTerminated()) {

}
System.out.println("Finished all threads");
这是你的问题:

while (!executor.isTerminated()) {

}
您的“主要”方法是让CPU不做任何事情。改为使用,线程将在没有繁忙等待的情况下阻塞

final ExecutorService executor = Executors.newFixedThreadPool(threadAmount);
final List<Callable<Object>> tasks = new ArrayList<Callable<Object>>();

for (int i = 1; i < 50; i++) {
    tasks.add(Executors.callable(new ActualThread(i)));
}
executor.invokeAll(tasks);
executor.shutdown();  // not really necessary if the executor goes out of scope.
System.out.println("Finished all threads");
final executor服务executor=Executors.newFixedThreadPool(threadAmount);
最终列表任务=新建ArrayList();
对于(int i=1;i<50;i++){
tasks.add(Executors.callable(新的ActualThread(i));
}
执行人。调用所有(任务);
executor.shutdown();//如果执行人超出范围,则不需要。
System.out.println(“完成所有线程”);

由于
invokeAll()
需要一个可调用的
集合,请注意helper方法的使用。实际上,您可以使用它来获取任务的
Future
s集合,这在任务实际生成您想要的输出时非常有用。

在第二个示例中,等待线程完成的代码在哪里?+1,稍微小一点的更改是使用
waittermination
@Mark,yes,但是,当
invokeAll()
为您准备时,为什么手动杂技呢?这个模型也鼓励重用执行器,这通常是一件好事。。。无论如何,这两种方法都是可行的。
final ExecutorService executor = Executors.newFixedThreadPool(threadAmount);
final List<Callable<Object>> tasks = new ArrayList<Callable<Object>>();

for (int i = 1; i < 50; i++) {
    tasks.add(Executors.callable(new ActualThread(i)));
}
executor.invokeAll(tasks);
executor.shutdown();  // not really necessary if the executor goes out of scope.
System.out.println("Finished all threads");