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