我想做一个我已经完成的任务,除了这次使用多线程。我必须从文件中读取大量数据(逐行),从每一行中获取一些信息,然后将其添加到地图中。该文件超过一百万行,因此我认为它可能会受益于多线程。
我不确定我在这里的方法,因为我以前从未在 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 线程并在 main 中检索地图。我将有多个 Mapper 线程,但我只在上面的代码中实例化了一个。
我也刚刚意识到我的 Parse 类不是一个线程,而只是另一个类,如果它没有覆盖 run() 方法,所以我认为 Parse 类应该是某种队列。
和想法?谢谢。
编辑:感谢所有的答复。似乎由于 I/O 将成为主要瓶颈,因此并行化几乎不会提高效率。但是,出于演示目的,我是否走在正确的轨道上?我仍然对不知道如何使用多线程感到有些困扰。