java一个后台线程启动的线程默认也是后台线程,那么当这个后台线程死亡的时候但这个时候用户线程还未死亡,它创建的子线程是怎样处理的?是随着父线程一同死亡还是继续运行,直至run方法结束或者用户线程死亡
PHP中文网2017-04-17 17:37:46
private class StopServer extends Thread
{
public void start()
{
this.setDaemon(true);
super.start() ;
}
@Override
public void run() {
ServerSocket serverSocket = null ;
Socket socket = null ;
try {
serverSocket = new ServerSocket(8001) ;
while (true) {
socket = serverSocket.accept();
String line = new BufferedReader(new InputStreamReader(socket.getInputStream())).readLine();
if (line.equals("shutdown"))
{
socket.getOutputStream().write("ok, start stop the server....\r\n".getBytes());
socket.getOutputStream().flush() ;
System.out.println("start a new thread to stop the server....") ;
//新创建的子线程
new Thread() {
public void start() {
setDaemon(true);
super.run();
}
public void run() {
System.out.println("start stopServer Thread...");
EchoServer2.this.stop();
}
}.start();
break ;
} else
{
if (!socket.isClosed())
socket.close();
}
}
}
catch (IOException e)
{
System.err.println("daemon thread exception: " + e);
e.printStackTrace();
}
finally {
System.out.println("stop stopServer...");
if(serverSocket != null && !serverSocket.isClosed())
try
{
serverSocket.close();
}
catch (IOException e)
{
e.printStackTrace();
}
if(socket != null && !socket.isClosed())
try {
socket.close();
}catch (IOException e)
{
e.printStackTrace() ;
}
}
}
}
這是我昨天自己寫的一個伺服器的一個後台線程, 這個線程主要用來監聽8001端口, 如果收到shutdown的命令, 就關閉服務器, 關閉服務器我啟動了一個新的線程, 也就是這個後台線程的子線程, 實際運行時,伺服器並沒有被關閉, 所以我判斷子線程會隨著整個後台線程一起死亡, 看來操作系統得重新念一遍書了. 煩擾大家了