gpt4 book ai didi

java - Executorservice 的行为需要解释

转载 作者:行者123 更新时间:2023-12-01 19:58:40 25 4
gpt4 key购买 nike

请考虑以下伪代码

private ExecutorService mPool;

private final static int THREADS = Runtime.getRuntime().availableProcessors(); // which is 8 in my case

mPool = Executors.newFixedThreadPool(THREADS);

while ( go through a long list of images )
{
if( !mPool.isShutdown() )
{
mPool.execute( new MyRunnable( path of image );
}
}

....

....


private class MyRunnable implements Runnable
{
public void run()
{
// do something with each image
}
}

我已经使用不同数量的线程执行了上述操作。以下是我的观察

100 threads  => 573 seconds
100 threads => 584 seconds ( Just tried for a second time with same number of threads )
50 threads => 574 seconds
10 threads => 502 seconds
5 threads => 589 seconds
1 thread => 695 seconds
8 threads => 584 seconds ( Same number of threads as the number of cores in my phone )
4 threads => 579 seconds
16 threads => 581 seconds

我有以下问题。

1) 为什么使用 4 个线程不会将时间增加到使用 8 个线程时的两倍?我观察到完成工作的时间几乎相同。

2) 当我使用超过 8 个线程时,操作系统是否只考虑 8 个或更少的线程?

3)是否有更好的编程方法来解决这个问题?

最佳答案

在您的代码中,ExecutorService 通过将 Runnable 分配给线程池中的特定线程来执行它。

一旦线程完成执行,线程池就可以为其重新分配新任务。换句话说,在单线程中运行时需要 1 小时的任务在 2 个线程中运行时可能最终需要 40 分钟。当我增加线程时,代码可能会花费更少的时间,但是即使有更多线程,最终池中的许多线程仍然未使用。

因此,使用包含 8 个线程的线程池的执行程序服务运行某些任务的执行时间不一定是 4 个线程的一半。这取决于所分配的任务。

  • 我建议您检查此任务为每个单独的图像运行一次所花费的时间。(我看到您有 1 个线程在 695 秒内运行的集体数据)。

  • 检查可运行的代码。有同步块(synchronized block)吗?这也会影响执行速度。

总而言之,您需要分解代码并找出哪些行在执行中花费了时间。然后您可以更好地将代码设计为彼此并行运行。

如果您分享更多有关您正在执行的操作以及如何准确计算执行时间的代码,您可能会得到

关于java - Executorservice 的行为需要解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59019255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com