Napisałem tak.Co uniemożliwia program?
public static void main(String[] args){
Thread thread = new Thread(() -> {
while(true){
try{
// do something
Thread.sleep(10);
}catch(InterruptedException ex){
System.out.println("ABC");
break;
}
}
});
JFrame frame = new JFrame();
frame.setSize(1280,720);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.addWindowListener(new WindowAdapter(){
@Override
public void windowClosed(WindowEvent e){
thread.interrupt();
}
});
thread.start();
frame.setVisible(true);
}
Kiedy kliknąłem przycisk „Zamknij” w oknie,
program trwało kilka sekund do końca.
Co uniemożliwia programowi wyjście?
A jak mogę zamknąć program natychmiast bez przy użyciu JFrame.EXIT_ON_CLOSE
?
Myślę, że mój wątek (while(true)
wątek) kończy się natychmiast
ponieważ "ABC" jest wyświetlany wkrótce po kliknięciu przycisku "zamknij".
Dziękuję.
EDYTUJ
to samo wydarzyło się bez mojego wątku.
public static void main(String[] args){
JFrame frame = new JFrame();
frame.setSize(1280,720);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setVisible(true);
}
EDIT2
public static void main(String[] args){
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
Thread[] threads = new Thread[5];
Thread.enumerate(threads);
System.out.println(Arrays.toString(threads));
System.err.println(LocalDateTime.now() + " SHUTDOWN");
}
));
JFrame frame = new JFrame();
frame.setSize(1280,720);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.addWindowListener(new WindowAdapter(){
@Override
public void windowClosed(WindowEvent e){
Thread[] threads = new Thread[5];
Thread.enumerate(threads);
System.out.println(Arrays.toString(threads));
System.err.println(LocalDateTime.now() + " CLOSE");
}
});
frame.setVisible(true);
}
wyjście było:
[Thread[AWT-EventQueue-0,6,main], Thread[DestroyJavaVM,5,main], null, null, null]
2016-08-02T19:04:50.465 CLOSE
[Thread[DestroyJavaVM,5,main], Thread[Thread-0,5,main], null, null, null]
2016-08-02T19:04:51.762 SHUTDOWN
Czy Twój pełny kod? Ponieważ 'thread' musi zostać zainicjowany – Cir0X
Nie mogę tego odtworzyć. Po naprawieniu problemów z kompilacją, "ABC" jest natychmiast drukowane po kliknięciu przycisku zamykania, a program zostaje zakończony. Zapoznaj się także z http://stackoverflow.com/documentation/swing/2266/swing-hello-world#t=201608020924423960976, aby dowiedzieć się, jak poprawnie uruchomić aplikację Swing. –
@ Cir0X Przepraszam, kod został uporządkowany dla jasności, redagowałem. –