前台线程:需要等待所有前台子线程执行完,主线程才能继续往下走。除非强行关掉主线程,所有前台子线程才会强行结束。
后台线程:不需要等待后台线程执行完,主线程会继续往下走。当主线程正常结束或非正常结束,所有后台子线程会强行结束,不需要等待非后台子线程执行完成。
//特别注意后台线程依附的主进程如果一直存在,后台线程启动后,除非强行关掉主线程或后台线程正常结束,否则后台线程会一直在执行。
线程池主线程等待子进程退出:
可以调用 executor.shutdown(),根据isTerminated判断是否执行完毕来决定主线程退出,否则直接退出后线程池所有子线程也就结束了。
另外如果子线程有阻塞,可用shutdownnow()打断子线程
public class ThreadTest{
public static void main(String[] args)
{
ExecutorService executor = Executors.newFixedThreadPool(NTHREDS);
for (int i = 0; i < NTHREDS; i++)
{
Runnable worker = new MyRunnableTest();
executor.execute(worker);
}
executor.shutdown();
while (!executor.isTerminated())
{
}
System.out.println("end!");
}
}
public class MyRunnablTest implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
try {
System.out.println("sleep before");
Thread.sleep(5000L);
System.out.println("sleep after");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace(); }
}
}