java - 后台线程死亡时其创建的子线程是怎么处理的?
巴扎黑
巴扎黑 2017-04-17 17:35:46
0
2
491

java一个后台线程启动的线程默认也是后台线程,那么当这个后台线程死亡的时候但这个时候用户线程还未死亡,它创建的子线程是怎样处理的?是随着父线程一同死亡还是继续运行,直至run方法结束或者用户线程死亡

巴扎黑
巴扎黑

全部回复(2)
洪涛
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的命令, 就关闭服务器, 关闭服务器我启动了一个新的线程, 也就是这个后台线程的子线程, 实际运行时,服务器并没有被关闭, 所以我判断子线程会随着整个后台线程一起死亡, 看来操作系统得重新念一遍书了. 烦扰大家了

PHPzhong
this.setDaemon(true);

因为是Daemon

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板