线程利用策略

时间:2014-12-02 19:27:53

标签: java multithreading performance concurrency

在我的Java系统中,我有X个人,每个人都有Y个字符串,其中Y>> X.我需要对每个字符串执行一些复杂的计算。为了提升流程,我在单独的线程中运行字符串计算过程(线程数= CPU核心* 2)。我的问题是,我应该将每个人的治疗方法放在单独的线程中,还是仅仅在单独的线程中运行字符串处理就够了?

换句话说,除了基于线程的字符串计算之外,我应该在单独的线程中执行人员处理吗?或者,因为我已经使用每个CPU内核数量的最大最佳线程数进行字符串处理,所以如果将这些人放在单独的线程中,我将无法受益。

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

4 个答案:

答案 0 :(得分:1)

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

P.S。像本主题中的其他人一样,我建议使用线程池来完成此任务。

P.P.S。考虑使用java.util.concurrent FixedThreadPool(启动n个线程,如果有更多任务等待空闲线程)或CachedThreadPool(如果有更多任务创建新线程,否则重用现有休眠线程)。

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html#newFixedThreadPool(int) https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html#newCachedThreadPool()

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我可能会创建一个具有可配置大小的线程池,它会处理人员对象的队列。

这允许线程访问,更新和处理整个人员数据,而不用担心与其他线程冲突。

如果进程中有IO,则可能会增加线程池大小,或者如果过度使用CPU则会减小它。

希望有所帮助

答案 3 :(得分:0)

如果处理每个字符串大约需要1μs或更多,那么您应该将每个字符串处理放在自己的Runnable中,并将该作业传递给具有与逻辑CPU一样多的工作线程的ThreadPool。如果它们更快,则应对它们进行批处理,以便处理作业队列的开销更少。