Я пытаюсь, чтобы каждый поток обращался к одному элементу цикла for, а другой поток обратился к следующему элементу. Я хочу сделать это, используя несколько потоков, и количество созданных нескольких потоков будет введено пользователем. Я сделал это с помощью службы executorservices и потоков. Я хочу сделать это, используя простые потоки. Правильно ли это? Есть ли способ лучше?Многопоточность/Параллелизация каждого элемента цикла 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);
}
Кроме того, можно иметь резьбу, чтобы не вернуться к предыдущему пункту, так как в предыдущей теме уже вычисленного значения? Любая помощь будет оценена по достоинству. Thanks
Кажется бессмысленным иметь потоки, а затем попытаться заблокировать его из-за 'synchronized'. хотя в этом случае это «это»? Если вы хотите предотвратить повторную обработку уже найденных строк, то, возможно, удалите его из 'map' –
Неясно, что вы подразумеваете под простой нитью. В потоках Java нет индексов (например, вы видите в OpenCL/Cuda), поэтому вам нужно расширить функциональность потоков, если вы хотите дать им индексы, хотя ваш runable COULD удерживает индекс. Ваша логика в этом приложении также ошибочна, поскольку количество создаваемых потоков не всегда будет соответствовать количеству обрабатываемых вами элементов. Минимально я бы изменил цикл for от 'x
@RalphRitoch Извините, мой английский. Я имел в виду «делать это, используя простые потоки», а не через ExecutorService или любой другой пакет. Просто потоки вместе с, возможно, Maps/ConcurrentHashMaps – Tao