线程是一个动态执行的过程,它也有一个从产生到死亡的过程。
主线程从main()方法开始执行,直到main()方法结束后停止JVM。如果主线程中启动了子线程,默认会等待被启动的所有线程都执行完run()方法才终止JVM。
实际上我们可以通过Thread方法来改变主线程和子线程退出的关系。
主线程退出时子线程也退出
如果一个Thread被标志位Daemon线程(守护线程),则所有的非Daemon线程都结束时,JVM才终止。因为从main()方法开始的就是一个非Daemon线程,我们可以将子进程标记为Daemon进程,这样主线程退出时,子线程也会跟着退出。
默认所有从Daemon线程产生的线程也是Daemon线程,在产生这些新线程的线程停止时,也应该一并跟着停止。
主线程等待子线程退出
主线程等待启动的子线程都结束之后再结束,只需要在主线程流中启动子线程后,子线程实例调用join()方法。它的意思是子线程使用join()方法加入至当前主线程的流程中,主线程会等待被加入的线程工作完毕,然后再继续它的动作。如
public static voidmain(String[] args) {
Threadt=new Thread(()->{
//方法操作
});
t.start();
try{
t.join();
}catch(InterruptedException e){
e.printStackTrace();
}
}
注意join方法需要进行异常捕捉,否则编译报错:
error: unreportedexception InterruptedException; must be caught or declared to be thrown
程序启动后,主线程就开始,在主线程中新建t,并在启动t后,将之加入(join())主线程流程中,所以t会先执行完毕,主线程才会继续原来的流程。
有时候加入的线程可能处理太久,我们可以设定该线程的处理时间,方法就是给join()传入一个整数值n(单位毫秒),表示加入的流程至多可处理n毫秒,过了这个时间,即使没执行完,也不理他了,主线程可继续执行原来的工作流程。
强制退出进程
System.exit(0);
线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。
网友评论