java 创建的线程为什么会结束

zhuailhw123 2018-06-23 07:35:33
我随便写的一个程序,主类创建了一个窗口,窗口显示后创建了一个线程,当我点击窗口关闭的时候,这个线程也结束了,是什么原因让这个线程结束的?这个线程我没有指定是后台线程,窗口关闭了,这个线程应该还在运行啊?
主类:
public class TT {

public static void main(String[] args)
{
// TODO Auto-generated method stub
new ss().init();

}
}

public class ss extends JFrame
{
private JTextArea msgArea;
private JTextField msgField;
public ss()
{
}

public void init()
{
this.msgArea=new JTextArea(20,50);
this.msgField=new JTextField(15);
JPanel pa=new JPanel();
pa.add(new JScrollPane(this.msgArea));
pa.add(this.msgField);
this.add(pa);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
this.setVisible(true);
RR r=new RR();
r.start();
System.out.println(r.isDaemon()); //输出false 说明不是后台线程

}

}

线程:
public class RR extends Thread
{

public void run()
{
while(true)
{

}

}

}
...全文
191 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
stacksoverflow 2018-06-23
  • 打赏
  • 举报
回复
可以用 catch (InterruptedException e) 响应中断来关闭线程。
先读读这篇博客

https://www.cnblogs.com/Coda/p/4509451.html
zhuailhw123 2018-06-23
  • 打赏
  • 举报
回复
明白了,原来JFrame.EXIT_ON_CLOSE会直接退出虚拟机,这样的话即使我在RR线程有finally块 也不会执行了吧?实际上我在RR线程run是这样的:
try
{
ss=new ServerSocket(30000);
while(true)
{
Socket socket=ss.accept();
new SQLThread(ds,socket).start();
}
}
//省略catch捕获代码
//fanally代码 关闭ss物理资源
}
SQLThread中run是这样的:
try
{
String line=null;
while((line=br.readLine())!=null)
{
//省略
}
//省略catch捕获代码
//fanally代码 关闭数据库连接等物理资源
}
这两个线程都会阻塞的,我如果直接退出虚拟机关闭线程,fanally代码无法执行,那我打开的网络连接等物理资源都无法关闭了,我怎么可以关闭窗口的时候,让阻塞的线程正常结束,执行fanally代码,从而关闭物理资源呢?
zhuailhw123 2018-06-23
  • 打赏
  • 举报
回复
引用 2 楼 verejava 的回复:
while(true)
{

}
线程死循环,一直运行。
改成
boolean isRun=true;
while(isRun)
{

}
JFrame frame = ...
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
isRun=false
}
});

Java 多线程 之 火车站售票实例

http://www.verejava.com/?id=16992917973569

明白了,原来JFrame.EXIT_ON_CLOSE会直接退出虚拟机,这样的话即使我在RR线程有finally块 也不会执行了吧?实际上我在RR线程run是这样的:
try
{
ss=new ServerSocket(30000);
while(true)
{
Socket socket=ss.accept();
new SQLThread(ds,socket).start();
}
}
//省略catch捕获代码
//fanally代码 关闭ss物理资源
}
SQLThread中run是这样的:
try
{
String line=null;
while((line=br.readLine())!=null)
{
//省略
}
//省略catch捕获代码
//fanally代码 关闭数据库连接等物理资源
}
这两个线程都会阻塞的,我如果直接退出虚拟机关闭线程,fanally代码无法执行,那我打开的网络连接等物理资源都无法关闭了,我怎么可以关闭窗口的时候,让阻塞的线程正常结束,执行fanally代码,从而关闭物理资源呢?
zhuailhw123 2018-06-23
  • 打赏
  • 举报
回复
引用 1 楼 stacksoverflow 的回复:
把这句话去掉试一下
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Using JFrame.EXIT_ON_CLOSE actually terminates the JVM (System.exit). All running threads will automatically be stopped.

If you want to perform some action when a JFrame is about to close, use a WindowListener.


JFrame frame = ...
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
// close sockets, etc
}
});

明白了,原来JFrame.EXIT_ON_CLOSE会直接退出虚拟机,这样的话即使我在RR线程有finally块 也不会执行了吧?实际上我在RR线程run是这样的:
try
{
ss=new ServerSocket(30000);
while(true)
{
Socket socket=ss.accept();
new SQLThread(ds,socket).start();
}
}
//省略catch捕获代码
//fanally代码 关闭ss物理资源
}
SQLThread中run是这样的:
try
{
String line=null;
while((line=br.readLine())!=null)
{
//省略
}
//省略catch捕获代码
//fanally代码 关闭数据库连接等物理资源
}
这两个线程都会阻塞的,我如果直接退出虚拟机关闭线程,fanally代码无法执行,那我打开的网络连接等物理资源都无法关闭了,我怎么可以关闭窗口的时候,让阻塞的线程正常结束,执行fanally代码,从而关闭物理资源呢?
verejava 2018-06-23
  • 打赏
  • 举报
回复
while(true)
{

}
线程死循环,一直运行。
改成
boolean isRun=true;
while(isRun)
{

}
JFrame frame = ...
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
isRun=false
}
});

Java 多线程 之 火车站售票实例

http://www.verejava.com/?id=16992917973569
stacksoverflow 2018-06-23
  • 打赏
  • 举报
回复
把这句话去掉试一下
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Using JFrame.EXIT_ON_CLOSE actually terminates the JVM (System.exit). All running threads will automatically be stopped.

If you want to perform some action when a JFrame is about to close, use a WindowListener.


JFrame frame = ...
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
// close sockets, etc
}
});

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧