Я делаю WordCounter, у которого есть несколько потоков, подсчитывающих слова в разных файлах. Я получил все, чтобы работать, кроме одной маленькой проблемы.LinkedBlockingQueue не может ждать выполнения нитей
Я не могу найти подходящий способ дождаться окончания резьбы. Все работает, если я устанавливаю Thread.sleep для ожидания короткого промежутка времени, единственная проблема заключается в том, что это не будет правильным решением, если счетчик занимает больше времени, чем сон.
import java.io.*;
import java.util.*;
import java.util.concurrent.BlockingQueue;
public class WordCounter implements Runnable{
private String file;
private BlockingQueue<Integer> q;
private int words = 0;
public WordCounter(String f, BlockingQueue<Integer> queue){
file = f;
q = queue;
}
public void run(){
try{
Scanner in = new Scanner(new File(file));
while (in.hasNext()){
in.next();
words++;
}
in.close();
System.out.println(file + ": " + words);
q.add(words);
}
catch (FileNotFoundException e){
System.out.println(file + " blev ikke fundet.");
}
}
}
Это код действительного слова-счетчика. Я хочу, чтобы мой основной поток ожидал, что эти потоки слов-счетчиков будут выполнять q.add (слова); перед выполнением чего-либо еще.
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class MainThread implements Runnable{
private String[] arguments;
public MainThread(String[] args){
arguments = args;
}
public void run() {
final BlockingQueue<Integer> queue = new LinkedBlockingQueue<Integer>();
for(String f : arguments){
WordCounter c = new WordCounter(f, queue);
Thread t = new Thread(c);
t.start();
}
while(!queue.isEmpty()){
try {
System.out.println(queue.take());
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Это основная нить. Мне нужно каким-то образом подождать, пока остальные потоки закончатся, прежде чем я продолжу свое заявление внизу, но как?
Заранее спасибо.
Это отличный способ справиться с этим - я не знал о классе Семафор! единственное, что вам нужно знать точно, сколько потоков порождено сразу. – C0D3LIC1OU5