Как остановить поток?
public class ParallelSearch {
private final String root;
private final String text;
private final Set<String> exts;
private volatile boolean finish = false;
private final BlockingDeque<String> paths = new LinkedBlockingDeque<>();
public ParallelSearch(String root, String text, Set<String> exts) {
this.root = root;
this.text = text;
this.exts = exts;
}
public void init() {
Thread search = new Thread() {
@Override
public void run() {
Set<FileVisitOption> opts = Collections.emptySet();
final int maxDeph = Integer.MAX_VALUE;
try {
Files.walkFileTree(get(root), opts, maxDeph, new MyFileVisitor());
} catch (IOException e) {
e.printStackTrace();
}
finish = true;
}
};
Thread read = new Thread() {
@Override
public void run() {
while (!finish || paths.size() > 0) {
Path path = null;
try {
//вот тут поток остановится и будет ждать появления файла, а что если файл так и не придёт??????то поток так и зависнет?.... как остановить поток?
path = get(paths.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
read.start();
search.start();
try {
search.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
read.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized List<String> result() {
return this.files;
}
private class MyFileVisitor implements FileVisitor<Path> {
//действия при посещении каталога
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
return FileVisitResult.CONTINUE;
}
//действия при посещении каждого файла
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
//не важно что тут будет происходить
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
//но если указать несуществующий каталог , то тут можно сгенерировать исключение
System.out.println("исключение отловлено файл не читается");
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
return FileVisitResult.CONTINUE;
}
}
}
Поток должен сам управлять своим жизненным циклом, из другого потока его останавливать нельзя. В вашем случае, чтобы исключить зависание, стоит использовать таймаут при получении данных:
path = get(paths.poll(1, TimeUnit.SECONDS));
Использовать таймауты блокирующих вызовов - это всегда хорошая практика.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть ключик 256 бит, который генерится KeyGenerator таким способом:
Имеется 4 класса с тестами TestClass1, TestClasss2, TestClass3, TestClass4Нужно создать 2 тест сьюта, каждый из которых будет включать в себя по 2 класса и запустить...
Я понимаю что есть возможность запуска Jmeter тестов на Jenkins с GitНо как это сделать - пока не понял, вроде надо через Pipeline , но не понимаю как(вроде...
Приложение отправляет изоброжения и несколько строчекПримерно так (пишу на телефоне