Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.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 线程利用策略_Java_Multithreading_Performance_Concurrency - Fatal编程技术网

Java 线程利用策略

Java 线程利用策略,java,multithreading,performance,concurrency,Java,Multithreading,Performance,Concurrency,在我的Java系统中,我有X个人,每个人都有Y个字符串,其中Y>>X。我需要对每个字符串执行一些复杂的计算。为了提升进程,我在单独的线程中运行字符串计算进程(线程数=CPU内核*2)。我的问题是,我应该把每个人的处理也放在单独的线程中,还是只在单独的线程中运行字符串处理就足够了 换句话说,除了基于线程的字符串计算之外,我是否应该在单独的线程中执行person处理?或者,因为我已经在使用每个CPU核的最大最佳线程数来处理字符串,如果将这些人放在单独的线程中,我将不会受益 所有人都是相互独立的。 所

在我的Java系统中,我有X个人,每个人都有Y个字符串,其中Y>>X。我需要对每个字符串执行一些复杂的计算。为了提升进程,我在单独的线程中运行字符串计算进程(线程数=CPU内核*2)。我的问题是,我应该把每个人的处理也放在单独的线程中,还是只在单独的线程中运行字符串处理就足够了

换句话说,除了基于线程的字符串计算之外,我是否应该在单独的线程中执行person处理?或者,因为我已经在使用每个CPU核的最大最佳线程数来处理字符串,如果将这些人放在单独的线程中,我将不会受益

所有人都是相互独立的。
所有人的字符串都是相互独立的。

我认为创建额外的线程会降低处理速度,因为创建新线程需要一些额外的开销。但可以肯定的是,试着做一个实验。尝试使用不同数量的线程,然后选择最佳数量

另外,与本主题中的其他人一样,我建议使用线程池来完成此任务

P.S.考虑使用JavaU.L.FieldTraceCub(启动N个线程,如果有更多的任务等待空闲线程)或CaseDeTeCuthCube(如果有更多任务创建新线程,则重用现有的睡眠线程)。


我首先假设线程是本机线程(出于性能原因,不是绿色线程)。 将对象的引用传递到线程中并没有真正的性能考虑 除了让gc不断跳过引用以进行清理,这比 将对象序列化/反序列化到线程中


长话短说,如果您知道正在运行的线程具有较高的利用率(即很少在io/net/db/etc上阻塞),则应避免创建任何超出硬件容量的不必要线程否则,您将强制cpu执行非常昂贵的线程上下文切换。

我可能会创建一个具有可配置大小的线程池,用于处理person对象队列

这允许线程访问、更新和处理整个persons数据,而不必担心与其他线程冲突

如果进程中存在IO,则可以增加线程池大小,如果过度使用CPU,则可以减小线程池大小


希望这会有所帮助

如果处理每个字符串的时间为1µs或更高,则可以将每个字符串处理放在其自己的可运行状态中,并将该作业传递给一个线程池,该线程池中的工作线程数与逻辑CPU的数目相同。如果它们更快,您应该对它们进行批处理,以减少处理作业队列的开销。

线程数=CPU内核*2
您是如何得出这个公式的?特别是:“最佳数量等于机器中的内核数”。我使用“*2”来确保我有足够的线程用于多核和多线程CPU。如果您还有其他建议,请分享您的意见。如果您不知道线程的行为,您无法确定最佳数字是多少。您完成任务的频率,无论是IO还是CPU限制。。例如,CPU限制的任务在每个核心上使用超过1个线程是没有意义的,任何更多的线程都会更慢。它们是CPU限制的,根据字符串上下文计算一些NLP排名。如果您以用户为基础进行处理,完成的
线程
不能帮助其他线程,这不是很遗憾吗?池中的每个线程将处理一个完整的人,然后移动到下一个,直到所有人都完成。好吧,这取决于人员任务有多大。是的,真的不清楚。。。我的第一个想法是
Person
任务将太大……如果字符串处理是大部分工作负载,并且您希望跨用户处理更多字符串,那么您将希望线程池处理字符串,而不是整个Person。您可能有一个线程来决定要处理哪些字符串,即迭代用户选择要处理的字符串,将字符串推送到队列中。如果您需要将工作负载更新回person对象,您可能需要创建一个包含字符串和person对象链接的流程记录,以便它可以执行任何更新。在我的特定情况下,有150人,而每个人大约有3500个字符串,我必须继续。这是安然电子邮件数据集。