我知道线程连接方法是如何工作的,但我有一个示例问题。请参阅下面的示例代码
public class RunnableJob implements Runnable{
@Override
public void run(){
Thread currentThread = Thread.currentThread();
System.out.println("Runnable job is run by" + currentThread.getName());
try{
Thread.sleep(1000);
}
catch(InterruptedException ie){
ie.printStackTrace();
}
}
}
public class ThreadExample{
public static void main(String[] args) throws InterruptedException{
RunnableJob runnableJob = new RunnableJob();
Thread thread1 = new Thread(runnableJob,"T1");
Thread thread2 = new Thread(runnableJob,"T2");
Thread thread3 = new Thread(runnableJob,"T3");
Thread thread4 = new Thread(runnableJob,"T4");
thread1.start();
thread1.join();
thread2.start();
thread2.join();
thread3.start();
thread3.join();
thread4.start();
thread4.join();
Thread thread5 = new Thread(runnableJob,"T5");
Thread thread6 = new Thread(runnableJob,"T6");
Thread thread7 = new Thread(runnableJob,"T7");
Thread thread8 = new Thread(runnableJob,"T8");
thread5.start();
thread6.start();
thread7.start();
thread8.start();
}
}
我知道,T1,T2,T3,T4会在完成之前阻塞主线程。但是有可能在T5,T6,T7,T8实际开始运行之前,主线程完成并且T5..T8仅保持在可运行状态。如果这是可能的,我怎么能产生相同的?
感谢。
答案 0 :(得分:5)
您正在寻找回答您问题的术语是“守护程序”线程。只要有非守护程序线程在运行,应用程序就不会终止,并且这些线程将能够运行到终止状态。
因此,在您的情况下,T5 ... T8将运行并完成,因为它们是非守护程序线程†。
来自Thread
的文档:
当Java虚拟机启动时,通常会有一个非守护程序线程(通常调用某个指定类的名为main的方法)。 Java虚拟机继续执行线程,直到发生以下任一情况:
•已调用Runtime类的exit方法,并且安全管理器已允许执行退出操作。
•所有非守护程序线程的线程都已死亡,无论是通过调用run方法返回还是抛出一个超出run方法传播的异常
† 事实上,JVM启动的原始单一非守护程序线程可能会在T5 ... T8之前进入终止状态。在这种情况下,这不会阻止T5 ... T8运行完成。