开发者社区 问答 正文

后台线程死亡时其创建的子线程是怎么处理的?

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

展开
收起
蛮大人123 2016-03-12 10:57:31 2071 分享 版权
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪
    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的命令, 就关闭服务器, 关闭服务器我启动了一个新的线程, 也就是这个后台线程的子线程, 实际运行时,服务器并没有被关闭, 所以我判断子线程会随着整个后台线程一起死亡.

    2019-07-17 19:00:26
    赞同 展开评论
问答分类:
问答标签:
问答地址: