gpt4 book ai didi

java - 如何有效地使用多线程

转载 作者:行者123 更新时间:2023-12-01 07:08:50 24 4
gpt4 key购买 nike

我想要完成一项已经完成的任务,除了这次使用多线程。我必须从文件中读取大量数据(逐行),从每行中获取一些信息,然后将其添加到 map 中。该文件超过一百万行长,因此我认为它可能会受益于多线程。

我不确定我的方法,因为我以前从未在 Java 中使用过多线程。我想让 main 方法进行读取,然后将已读取的行提供给另一个线程,该线程将格式化字符串,然后将其提供给另一个线程以放入映射中。

public static void main(String[] args)
{
//Some information read from file
BufferedReader br = null;
String line = '';
try {
br = new BufferedReader(new FileReader("somefile.txt"));
while((line = br.readLine()) != null) {
// Pass line to another task
}


// Here I want to get a total from B, but I'm not sure how to go about doing that

}


public class Parser extends Thread
{
private Mapper m1;

// Some reference to B
public Parse (Mapper m) {
m1 = m;
}

public parse (String s, int i) {
// Do some work on S
key = DoSomethingWithString(s);
m1.add(key, i);
}

}

public class Mapper extends Thread
{
private SortedMap<String, Integer> sm;
private String key;
private int value;
boolean hasNewItem;

public Mapper() {
sm = new TreeMap<String, Integer>;
hasNewItem = false;
}

public void add(String s, int i) {
hasNewItem = true;
key = s;
value = i;
}

public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
if (hasNewItem) {
// Find if street name exists in map
sm.put(key, value);
newEntry = false;
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
// I'm not sure how to give the Map back to main.
}
}

我不确定我是否采取了正确的方法。我也不知道如何终止 Mapper 线程并在主线程中检索 map 。我将有多个 Mapper 线程,但我在上面的代码中只实例化了一个。

我还刚刚意识到我的 Parse 类不是线程,而只是另一个类(如果它不重写 run() 方法),所以我认为 Parse 类应该是某种队列。

还有想法吗?谢谢。

编辑:感谢您的所有回复。看来,由于 I/O 将成为主要瓶颈,因此并行化不会带来多少效率优势。但是,出于演示目的,我走在正确的轨道上吗?我还是有点不知道如何使用多线程。

最佳答案

为什么需要多线程?你只有一张磁盘,而且它的速度只能这么快。几乎可以肯定,多线程在这种情况下没有帮助。如果确实如此,从用户的角度来看,这将是非常小的。多线程不是您的问题。从大文件中读取是您的瓶颈。

关于java - 如何有效地使用多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17957162/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com