Как остановить поток через итеррапт? JAVA

172
24 ноября 2018, 02:10

Как остановить поток?

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;
        }
    }
}
Answer 1

Поток должен сам управлять своим жизненным циклом, из другого потока его останавливать нельзя. В вашем случае, чтобы исключить зависание, стоит использовать таймаут при получении данных:

path = get(paths.poll(1, TimeUnit.SECONDS));

Использовать таймауты блокирующих вызовов - это всегда хорошая практика.

READ ALSO
KeyGenerator. разница между &ldquo;AES&rdquo; в KeyStore и без

KeyGenerator. разница между “AES” в KeyStore и без

Есть ключик 256 бит, который генерится KeyGenerator таким способом:

169
TestNG - параллельный запуск Test Suites

TestNG - параллельный запуск Test Suites

Имеется 4 класса с тестами TestClass1, TestClasss2, TestClass3, TestClass4Нужно создать 2 тест сьюта, каждый из которых будет включать в себя по 2 класса и запустить...

191
JMeter + Git + Jenkins + Maven

JMeter + Git + Jenkins + Maven

Я понимаю что есть возможность запуска Jmeter тестов на Jenkins с GitНо как это сделать - пока не понял, вроде надо через Pipeline , но не понимаю как(вроде...

142
Retrofit android MultiPart

Retrofit android MultiPart

Приложение отправляет изоброжения и несколько строчекПримерно так (пишу на телефоне

182