Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.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 - Fatal编程技术网

Java 我应该使用一个线程来更新数组中每个对象的值吗

Java 我应该使用一个线程来更新数组中每个对象的值吗,java,multithreading,Java,Multithreading,我正在为一个大语料库做50个单词的互信息。我需要计算这些目标词和每个目标词的相邻词的并发数 有一个大小为50的对象数组,每个单词一个 我有一根线来读台词。当出现新行时,我需要更新所有这些对象的值 我想用多线程的方式写 我应该使用50个线程,每个线程负责这个数组中的一个对象吗 如果我为每个对象使用一个线程,我是否应该使用50个队列来存储输入行,并为每个线程使用一个队列 我在考虑生产者-消费者模式,但在只有一个队列的情况下,它看起来有点不同…在多核/多cpu机器上运行时,多线程是最有益的。应根据机器

我正在为一个大语料库做50个单词的互信息。我需要计算这些目标词和每个目标词的相邻词的并发数

有一个大小为50的对象数组,每个单词一个

我有一根线来读台词。当出现新行时,我需要更新所有这些对象的值

我想用多线程的方式写

我应该使用50个线程,每个线程负责这个数组中的一个对象吗

如果我为每个对象使用一个线程,我是否应该使用50个队列来存储输入行,并为每个线程使用一个队列


我在考虑生产者-消费者模式,但在只有一个队列的情况下,它看起来有点不同…

在多核/多cpu机器上运行时,多线程是最有益的。应根据机器上可用的内核数推断线程数。如果有5根线芯,则应纺出5根线。如果有更多线程,您可能会由于CPU上下文切换而开始降低效率

下面是一个如何做到这一点的示例:

int coreCount = Runtime.getRuntime().availableProcessors();
for(int i = 0; i < coreCount; i++) {
  Thread thread = new YourThreadClass();
  thread.start();
}
int corecont=Runtime.getRuntime().availableProcessors();
对于(int i=0;i
你的意图有点让人困惑。我将试着大致讨论一下。运行的线程数不应超过CPU核数(有些人认为是CPU核数的两倍),因为在这之后,您不会获得更多的执行速度,但确实要付出代价。 你也应该考虑一下你的“新行”输入的效果。如果所有对象都以相同的方式更新,则不需要那么多队列,一个就足够了。
如果这些对象在非依赖的时间被单独更新,您可以按照建议的50个线程使用50个队列来实现它,但是如果更新是统一的,则应该考虑用更少的线程找到合适的解决方案(可能在对象之间有一些逻辑连接,这可以帮助您以较少的线程分组它们中的一些)。

需要更多信息-您的一致性要求是什么?例如,在处理下一行之前,是否所有对象都需要用一行更新?Q:在处理下一行之前,是否所有对象都需要用一行更新?不必要。首先,我不明白为什么需要用多线程的方式进行更新。第二,如果你必须这样做,我不建议你为这个任务打开50个线程。好吧,如果你真的选择50个线程,你可以如下实现:你的阅读器线程读取一行,解析它,并将单词放入适当的队列(其中50个),而这些队列由单个线程清空。也就是说,你应该考虑这些单词之间是否有任何依赖关系,例如队列B中的第七个单词需要队列A的第五个单词。这是一个很好的练习。我的建议是有两个线程,一个从行的开头开始,另一个从和开始,每个线程都更新其相应的对象,不需要队列。