Я на 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)