今回はマルチスレッドを使用する以外は、既に完了したタスクを実行したいと考えています。ファイルから大量のデータを (1 行ずつ) 読み取り、各行からいくつかの情報を取得して、それを Map に追加する必要があります。ファイルの長さは 100 万行を超えているため、マルチスレッドの恩恵を受ける可能性があると考えました。
Javaでマルチスレッドを使用したことがないため、ここでのアプローチについてはよくわかりません。メインメソッドに読み取りを実行させ、読み取った行を別のスレッドに渡して文字列をフォーマットし、それを別のスレッドに渡してマップに入れたいと考えています。
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 スレッドを終了してメインでマップを取得する方法もわかりません。複数の Mapper スレッドを用意しますが、上記のコードでインスタンス化したのは 1 つだけです。
また、Parse クラスはスレッドではなく、run() メソッドをオーバーライドしない場合は別のクラスにすぎないことに気付いたので、Parse クラスはある種のキューであるべきだと考えています。
そしてアイデア?ありがとう。
編集:すべての返信に感謝します。I/O が主要なボトルネックになるため、これを並列化しても効率のメリットはほとんどないようです。ただし、デモンストレーションの目的で、正しい軌道に乗っていますか? マルチスレッドの使い方がわからないので、まだ少し悩んでいます。