Java多线程 - 6个线程或30个线程?

Cli*_*ote 0 java multithreading threadpool

我正在研究一个需要执行一些光学字符识别的多线程应用程序.该应用程序的要求是它必须真正,非常快速地工作.

有一段时间,我必须同时阅读6个不同的单词.所以我正在做的是,开始6个线程,一个专门用于阅读每个单词的线程.

但是,我想知道我是否应该更进一步,并为一个单词中的每个字符开始一个线程.例如,如果我有6个单词且每个单词有大约5-6个字符,这将意味着30-36个线程(对于更长的单词,可能高达50-70个线程).

要处理每个单独的字符,它似乎需要10-30毫秒,每个字总共需要200-300毫秒.(我需要将它降低到每个单词100毫秒或更少).

哪种策略实际上会给我带来更好的表现?每个字一个线程,或每个字符一个线程?

Gra*_*ray 5

哪种策略实际上会给我带来更好的表现?每个字一个线程,或每个字符一个线程?

答案很大程度上取决于您的硬件架构和实际处理过程.您的处理是完全 CPU限制还是有任何日志记录或其他IO?回答这个问题的最好方法是通过多次试验来尝试各种不同的线程设置,以查看哪个更好.为了获得最准确的结果,您的测试运行时间应该超过几秒钟,以排除JIT和其他Java初始化.

结合其他想法:

  • 正如@Sotirios和其他人所提到的,仅仅因为上下文切换开销而在问题上抛出更多线程可能会让它运行得更慢.

  • 您应该使用ExecutorService线程池,这样您每次都不会分叉和收割线程.线程启动/关闭并不是一个微不足道的过程.