Я делаю что-то вроде веб-сканера в консольном приложении java, у меня есть класс, который реализует работоспособный интерфейс, и при запуске метода я получаю операцию, которую хочу выполнить (например, для цикла for, который повторяет каждый URL, даетсяв качестве входных данных и выполнить все вычисления).
Я хочу, чтобы каждая итерация выполнялась другим потоком.Поэтому я создал пул потоков, используя executorsservice (количество потоков совпадает с числом URL), и я использовал ключевое слово synchronized, чтобы разрешить только одному потоку одновременно выполнять блок вычислений.
Но как я могу гарантировать, чтотот же поток не будет повторно входить сначала в блок кода сноваесли потребуется, я опубликую фрагмент кода позже.
Спасибо.
Вывод, который я получаю, следующий:
Я ищу по 2 ключевым словам в каждом URL.в этом примере 1 URL и 2 ключевых слова.
Текущая тема: pool-1-thread-2 ----------------- Текущая тема: pool-1-thread-1 -----------------
Название: Wikipedia, URL бесплатной энциклопедии: https://en.wikipedia.org Ключевое слово Times Free Найдено: 41
Название: Википедия, URL бесплатной энциклопедии: https://en.wikipedia.org Ключевое слово Times Free Найдено: 41
Название: Википедия, URL бесплатной энциклопедии: https://en.wikipedia.org Ключевое слово Times найдено Wikibooks: 82
Название: Wikipedia, URL бесплатной энциклопедии: https://en.wikipedia.org Ключевые слова Times Wikibooks Найдено: 82
Я думаю, что сделал это каким-то образом, но сейчас у меня возникают новые проблемынапример, смотрите комментарии внутри метода run.
public class KeywordCounter {
private List keylist;
private List weblist;
public KeywordCounter(List keywordlist, List listWebsites) {
this.keylist = new ArrayList(keywordlist);
this.weblist = new ArrayList(listWebsites);
}
public void threadCreate(List klist, List listWebsites) {
// TODO Auto-generated method stub
ExecutorService executor = Executors.newFixedThreadPool(2);
for (int w = 0; w < this.weblist.size(); w++) {
executor.execute(new Runnable() {
private List keylist = new ArrayList(klist);
private List weblist = new ArrayList(listWebsites);
@Override
public synchronized void run() {
System.out.println("Current Thread: " + Thread.currentThread().getName().toString() + " ")
// Computations i want one thread inside here each time but i think both threads are entering same time cause i saw 4 results instaid of 2.
//Also i want inside here to pass the w variable of the for loop, cause i need it for further computations how i can achieve this?.
});
}
}
}