我想完成一個我已經完成的任務,除了這次使用多線程。我必須從文件中讀取大量數據(逐行),從每行中獲取一些信息,然後將其添加到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