別のスレッドが次のアイテムにアクセスしている間、各スレッドがforループの単一項目にアクセスしようとしています。私は、複数のスレッドを使用してこれを行いたいと、作成された複数のスレッドの数は、ユーザーによって入力されます。私はこれをexecutorserviceとストリームを使って行っています。私は単純なスレッドを使ってこれをやりたい以下は正しいですか?より良い方法がありますか?forループの各項目のマルチスレッド/並列化JAVA
Map<String, String> fileMap = new HashMap<>();
fileMap.put("Age", "Age is not remotely associated with it.");
fileMap.put("Gender", "Gender plays a role but not that important.");
fileMap.put("Money", "People do not believe but this is the only factor that matters.");
Runnable myRunnable = new Runnable(){
public void run(){
for (Map.Entry<String, String> entry : fileMap.entrySet()) {
synchronized(this){
int counter = 0;
Pattern p = Pattern.compile("not");
Matcher m = p.matcher(entry.getValue());
while (m.find()) {
counter++;
}
System.out.println("File Name: " + entry.getKey());
System.out.println("Count: " + counter);
System.out.println(Thread.currentThread().getName());
}
}
}
};
int n = Integer.parseInt(args[0]);
for (int x=0; x<n; x++)
{
Thread temp= new Thread(myRunnable, "Thread #" + x);
temp.start();
System.out.println("Started Thread:" + x);
}
また、それは以前のスレッドがすでに値を計算しているので、バック前の項目に移動するにはいないのスレッドを持つことが可能でしょうか? ご協力いただければ幸いです。ありがとう
はスレッドを持っていて、それが 'synchronized'のために実行をブロックしようとしているように見えます。この場合、「これ」は何ですか?既に見つかっている行を再処理しないようにしたい場合は、 'map'から削除してください。 –
単純なスレッドの意味はわかりません。 Javaスレッドは、OpenCL/Cudaのようなインデックスを持っていませんので、実行可能なCOULDがインデックスを保持しているにもかかわらず、スレッドの機能を拡張する必要があります。作成しているスレッドの数が、処理している項目の数と必ずしも一致しないため、このアプリケーションのロジックにも欠陥があります。最小限私はあなたのforループを 'x
@RalphRitoch私の英語を間違えます。私は '単純なスレッドを使ってこれを行う'ことを意味し、ExecutorServiceやその他のパッケージは使用しませんでした。おそらくMaps/ConcurrentHashMaps – Tao