J'essayais d'implémenter un problème de Consumer-Producer avec BlockingQueue. Pour le faire avec un certain but, j'ai décidé d'écrire l'outil de recherche de fichiers.Java. Consommateur - Producteur avec BlockingQueue. Outil de recherche
J'ai décidé que le mécanisme de recherche fonctionnait récursivement, et chaque nouveau répertoire va avoir un nouveau pool de threads pour accélérer la recherche. Mon problème est que je n'ai aucune idée de la façon dont je peux mettre en œuvre un mécanisme qui arrête d'imprimer des threads (consommateurs) à la fin - lors de la recherche de threads faire le travail. J'essayais de le faire avec des idées comme POISON PILLS, mais ça ne marche pas bien (les threads s'arrêtent avant d'imprimer les résultats). Des idées comment puis-je faire cela?
Voici un code:
mécanisme de recherche:
public class SearchingAlgorithm implements Runnable {
private final File file;
private BlockingQueue<File> queue;
private ExecutorService executor;
public SearchingAlgorithm(File fileName, BlockingQueue<File> queue) {
this.file = fileName;
this.queue = queue;
this.executor = Executors.newWorkStealingPool();
}
@Override
public void run() {
try {
searchDeep();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void searchDeep() throws InterruptedException {
File[] files = file.listFiles();
if (files != null) {
for (File fil : files) {
if (fil.isDirectory()) {
executor.submit(new SearchingAlgorithm(fil, this.queue));
} else {
this.queue.add(fil);
}
}
}
}
}
Imprimante:
public class ContainingCheckAlgorithm implements Runnable {
private BlockingQueue<File> queue;
// private ExecutorService executor;
private String keyWord;
public ContainingCheckAlgorithm(BlockingQueue<File> queue, String keyWord) {
this.queue = queue;
this.keyWord = keyWord;
// executor = Executors.newFixedThreadPool(2);
}
@Override
public void run() {
try {
printFile();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void printFile() throws InterruptedException {
while (true) {
File takeFile = queue.take();
String fileName = takeFile.getAbsolutePath()
.toLowerCase();
boolean isContainingKeyWord = fileName.contains(keyWord.toLowerCase());
if (isContainingKeyWord) {
System.out.println(takeFile.getAbsolutePath());
}
}
}
}
classe de test principal:
public class MainClass {
public static void main(String[] args) throws InterruptedException {
ExecutorService executor = Executors.newFixedThreadPool(2);
BlockingQueue<File> queue = new LinkedBlockingQueue<>();
File fileName = new File("C:/");
SearchingAlgorithm sa = new SearchingAlgorithm(fileName, queue);
executor.submit(sa);
ContainingCheckAlgorithm ca = new ContainingCheckAlgorithm(queue, "Slipknot");
executor.submit(ca);
executor.shutdown();
}
}