我想完成一个我已经完成的任务,除了这次使用多线程。我必须从文件中读取大量数据(逐行),从每行中获取一些信息,然后将其添加到Map中。该文件超过一百万行,所以我认为它可能会受益于多线程。如何使用多线程来有效地使用多线程
我不确定我的方法,因为我从来没有在Java中使用过多线程。 我想让主要方法进行读取,然后将已读取的行赋予另一个将格式化String的线程,然后将其传递给另一个线程以放入地图。
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将成为主要瓶颈,因此并行化将会带来很少的效率收益。但是,出于示范的目的,我是否正确地走上正轨?不知道如何使用多线程,我仍然有点困扰。
从文件中读取是代码的瓶颈。多线程无助于此。 –
使用多线程可以在这里拍摄你的脚。您的线程运行速度可能比@HovercraftFullOfEels指出的Disk IO速度快得多。你打算如何管理哪个线程读取多少行。如果一个或多个线程由于某些不可预知的原因而失败,那么该如何处理? 我建议你在一个线程中处理一个文件,并根据手头的机器选择一种处理方法。如果您的服务器具有128个RAM,请将其读入内存,然后执行处理,如果不是逐行处理。 – JVXR