【问题标题】:Is there usage for the main thread not calling `join()` to wait for a created thread to finish in Java?主线程有没有使用不调用`join()`来等待创建的线程在Java中完成?
【发布时间】:2018-05-08 12:42:33
【问题描述】:

在 Java 中,一个主线程创建并启动另一个线程。 如果主线程没有调用join()等待新线程完成,则在主线程退出后新线程会继续运行。 主线程不调用join()有什么用法吗?

为了对比Linux,我从APUE了解到,当一个程序fork()sa子进程并没有调用waitpid()来等待子进程完成而是在子进程继续运行时退出,我们可以

  • 将要被init进程收养的孩子re-parent(可以防止它变成僵尸进程),并且

  • 让子进程不是任何进程组或进程会话的领导者,这样子进程就可以调用setsid()来解除与其控制终端的关联(这可以使子进程成为守护进程)

上述两个好处不适用于Java线程是否正确?

谢谢。

【问题讨论】:

    标签: java linux multithreading


    【解决方案1】:

    任何 Java 应用程序在退出之前都会隐式地 joins 所有非守护线程,因此主线程确实 join 所有正在运行的线程。请参阅here 了解更多详情。

    在 Java 中,进程/线程没有明确需要拥有/父线程。所有线程都只是started 并运行到完成或直到它们被中断。

    不熟悉Linux,但听起来你描述的Linux场景类似于Java中的守护线程机制。

    【讨论】:

      【解决方案2】:

      一种用法是当您处理来自 servlet 的 http 请求时,该 servlet 有大量处理,需要在请求超时之前回复接收数据的确认。

              import java.io.IOException;
              import javax.servlet.ServletException;
              import javax.servlet.annotation.WebServlet;
              import javax.servlet.http.HttpServlet;
              import javax.servlet.http.HttpServletRequest;
              import javax.servlet.http.HttpServletResponse;
      
        /**
        * Servlet implementation class Processing
         */
         @WebServlet("/Processing")
        public class Processing extends HttpServlet {
            private static final long serialVersionUID = 1L;
      
      /**
       * @see HttpServlet#HttpServlet()
       */
      public Processing() {
          super();
          // TODO Auto-generated constructor stub
      }
      
      /**
       * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
       */
      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          // TODO Auto-generated method stub
          response.getWriter().append("Served at: ").append(request.getContextPath());
      }
      
      /**
       * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
       */
      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          // TODO Auto-generated method stub
          new Thread(new Runnable() {
      
              @Override
              public void run() {
                  // do the heavy data processing which takes lots of time.lets assume large
                  //amount of data to be added to data base.
      
              }
      
          }).start();
          //response back to client by informing data received before request //time out on client side
          response.getWriter().write("request receive sucessfully");
      }
      
       }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-10
        • 2015-04-17
        • 1970-01-01
        • 2017-07-19
        相关资源
        最近更新 更多