Java 我应该使用多少线程来渲染图像?

Java 我应该使用多少线程来渲染图像?,java,multithreading,concurrency,threadpool,bufferedimage,Java,Multithreading,Concurrency,Threadpool,Bufferedimage,我看到过很多类似的问题,但似乎没有一个能提供任何科学的评价。我的问题是,我想为分形渲染应用程序优化Java线程池中使用的线程数量 通过将图像分割成子图像,我能够同时渲染,因为每个子图像是完全独立的 因此,我的想法是根据处理器中可用线程的数量创建一个固定线程池。然后,每个线程可以渲染一个或多个子图像。如果我这样做,我应该使用线程与子映像的比例是多少?有没有更好的方法来分摊负荷 如果我有很多不同核数的计算机,我就可以通过一个实验自己找到答案。不幸的是,我没有这种奢侈=[/p>在目前系统上没有其他CP

我看到过很多类似的问题,但似乎没有一个能提供任何科学的评价。我的问题是,我想为分形渲染应用程序优化Java线程池中使用的线程数量

通过将图像分割成子图像,我能够同时渲染,因为每个子图像是完全独立的

因此,我的想法是根据处理器中可用线程的数量创建一个固定线程池。然后,每个线程可以渲染一个或多个子图像。如果我这样做,我应该使用线程与子映像的比例是多少?有没有更好的方法来分摊负荷


如果我有很多不同核数的计算机,我就可以通过一个实验自己找到答案。不幸的是,我没有这种奢侈=[/p>在目前系统上没有其他CPU密集型应用程序运行的前提下,每个处理器有一个线程通常是理想的

这背后的基本原理是,线程之间的切换是一项昂贵的操作(相对而言),因此有效使用多核CPU的最佳方法是避免线程切换,同时仍为CPU提供足够的线程,以便每个核心都得到利用

系统的CPU核数可通过以下方式获得:

Runtime.getRuntime().availableProcessors();

在具有超线程的系统上,这将为您提供虚拟CPU的数量,而不是物理CPU的数量。当您为每个虚拟核心运行一个线程而不是为每个物理核心运行一个线程时,每个线程可能需要更长的时间才能完成,但总体而言,它们在同一时间完成的工作更多,因为CPU的内部资源可以更高效地使用y、 因此,您应该为每个虚拟核心运行一个线程,除非每个线程尽快完成对您来说很重要(在这种情况下,您可能会考虑使用单线程,因为执行单个线程的多核英特尔CPU超时地运行内核,并在内核之间切换,以便其他人能够冷却)。
对于要向最终用户发送的应用程序,您可能会考虑将此值用作默认值,但允许它们更改它,因为用户可能希望与其他CPU密集型应用程序并行运行程序。在这种情况下,它们可能希望减少由应用程序生成的线程数以不减慢。E.P.>你的子图像渲染是用CPU完成的,还是有磁盘访问要考虑的?没有磁盘访问。至于“完全CPU”部分,我现在也要扩展我的算法来利用GPU。听起来不错,但是这真的能解决吗?考虑java选择线程去哪里,所以没有保证。在所有线程之间会有一个均匀的分布?此外,调度程序可以随意暂停这些线程中的任何一个,因此在任何给定时刻,可能只有少数线程在运行。