【发布时间】:2016-08-02 09:05:19
【问题描述】:
我是这样写的。
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);
}
当我点击窗口的“关闭”按钮时,
该程序需要几秒钟才能结束。
是什么阻止程序退出?
以及如何使用JFrame.EXIT_ON_CLOSE 立即不关闭程序?
我认为我的线程(while(true)线程)立即结束
因为在我单击“关闭”按钮后不久就会显示“ABC”。
谢谢。
编辑
没有我的线程也会发生同样的事情。
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);
}
输出是:
[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
【问题讨论】:
-
那是你的完整代码吗?因为
thread需要初始化 -
我无法重现这个。修复编译问题后,单击关闭按钮时立即打印
ABC,程序终止。另请查看stackoverflow.com/documentation/swing/2266/… 以了解如何正确启动 Swing 应用程序。 -
@Cir0X 对不起,为了清楚起见,我编辑了代码。
-
您可能想检查github.com/afester/CodeSamples/blob/master/Java/Swing/src/com/… 是否重现了我们的问题。如果有用,请在您的问题中随意将其用作minimal reproducible example。如果是,还要添加输出,以便每个人都知道您正在谈论的时间跨度。
-
查看我对以下答案的评论。您观察到的行为已记录在案。
标签: java multithreading swing jframe