搜尋

首頁  >  問答  >  主體

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

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

巴扎黑巴扎黑2888 天前496

全部回覆(2)我來回復

  • PHP中文网

    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的命令, 就關閉服務器, 關閉服務器我啟動了一個新的線程, 也就是這個後台線程的子線程, 實際運行時,伺服器並沒有被關閉, 所以我判斷子線程會隨著整個後台線程一起死亡, 看來操作系統得重新念一遍書了. 煩擾大家了

    回覆
    0
  • PHPz

    PHPz2017-04-17 17:37:46

    this.setDaemon(true);

    因為是Daemon

    回覆
    0
  • 取消回覆