Java 线程连接方法。主线程能否在其他线程之前完成?
我知道线程连接方法是如何工作的,但我有一个示例问题。请参见下面的示例代码Java 线程连接方法。主线程能否在其他线程之前完成?,java,multithreading,Java,Multithreading,我知道线程连接方法是如何工作的,但我有一个示例问题。请参见下面的示例代码 public class RunnableJob implements Runnable{ @Override public void run(){ Thread currentThread = Thread.currentThread(); System.out.println("Runnable job is run by" + currentThread.getName
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仅保持在可运行状态。如果这是可能的,我如何生产同样的产品
谢谢。回答您问题的术语是守护进程线程。只要有非守护进程线程在运行,应用程序就不会终止,这些线程将能够运行到终止状态 因此,在您的情况下,T5…T8将运行并完成,因为它们是非守护进程线程† 从以下文件中: 当Java虚拟机启动时,通常有一个非守护进程线程,该线程通常调用某个指定类的main方法。Java虚拟机将继续执行线程,直到发生以下任一情况: •类运行时的退出方法已被调用,并且安全管理器已允许进行退出操作 •通过调用run方法返回或抛出传播到run方法之外的异常,非守护进程线程的所有线程都已死亡
†事实上,JVM启动的原始单个非守护进程线程可能在T5…T8 do之前进入终止状态。在这种情况下,这不会阻止T5…T8运行到完成状态。你说的产生相同的结果是什么意思?意味着主线程可能在T5到T8之前完成吗?如果可能,我可以复制相同的效果吗?任何线程都可以按任何顺序完成。主线程完成时不会发生任何特殊情况,除非它是最后一个非守护进程线程。?我不认为这意味着主线程不会终止,它只是意味着jvm实例将一直存在,直到所有非Daemon线程都完成。@NathanHughes-你说得对,这是我草率的措辞。我关注的是T5…T8是否仍处于可运行状态,这只是问题的一部分。