Thread.sleep () не генерирует InterruptedException после прерывания потока - PullRequest
0 голосов
/ 24 августа 2018

Я на 100% уверен, что Thread.sleep(3000); должен выдать InterruptedException, либо если статус прерывания потока был установлен на true до или во время вызов сна. См. Вызов Thread.sleep () с прерванным статусом установленным?

Но я никогда не получаю исключения, когда прерываю поток заранее, только в течение 3 секунд сна. Как это может быть?

Вот концепция моего кода:

public class MyView extends CustomComponent implements View {
    private Thread importThread;
    private Collection<File> allUploadFiles = new HashSet<>();

    public MyView(){
        allUploadFiles.add(new File("/foo/bar.xlsx"));
        allUploadFiles.add(new File("/foo/bar.xlsx"));
        allUploadFiles.add(new File("/foo/bar.xlsx"));
        allUploadFiles.add(new File("/foo/bar.xlsx"));

        createMainLayout();
    }

    private void createMainLayout(){
        // Builds the layout here, including the upload button:
        MultiFileUpload upload = new MultiFileUpload(uploadFinishedHandler, uploadStateWindow, true);
        upload.setAllUploadFinishedHandler(this::allUploadFinishedHandler);
    }

    private void allUploadFinishedHandler(){
        final UI ui = UI.getCurrent();
        final VaadinSession session = VaadinSession.getCurrent();

        importThread = new Thread(() -> {
            UI.setCurrent(ui);
            VaadinSession.setCurrent(session);

            for (File uploadFile : allUploadFiles){
                try {
                    // system output to see when the thread sleeps
                    System.out.print("start sleep");
                    Thread.sleep(3000);
                    System.out.print("end sleep");

                    MyImporter.import(uploadFile); // takes about a minute
                } catch (InterruptedException e){
                    Thread.currentThread.interrupt(); // keep the interrupted status
                    System.out.print("InterruptedException thrown!");
                    break;
                }
            }

            allUploadFiles.clear();
        });

        importThread.start();
    }

    /**
    * this is the clickListener of the interruptImport Btn which I left out in this codesample
    */
    public void interruptImport(){
        importThread.interrupt();
    }
}

Всякий раз, когда я прерываю importThread между системным выходом "start sleep" и "end sleep", выдается InterruptedException, и все работает нормально.

Но когда я прерываю его в любое другое время, ничего не происходит, поток продолжает импортировать файл за файлом. Thread.sleep(3000); позволяет подождать 3 секунды, но исключение не выдается.

Я не знаю, что я делаю неправильно, и мне действительно нужна помощь!


Редактировать: Я заменил метод импорта на метод keep-me-busy, как предложено k5_, Проблема осталась.

Затем я добавил этот кодовый блок прямо в uploadFile-forloop , и он заработал (Редактировать 2: не всегда. Пока не могу понять, почему)

if(Thread.interrupted()){
    Thread.currentThread().interrupt();
    System.out.print("interrupted status detected manually");
    break;
}

но если я использую Thread.currentThread (). IsInterrupted () в условии if, это не сработает.

Почему Thread.interrupted () работает, но не Thread.currentThread (). IsInterrupted () или даже Thread.sleep (3000)

...