【问题标题】: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()来等待子进程完成而是在子进程继续运行时退出,我们可以
上述两个好处不适用于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");
}
}