线程连接方法。主线程可以在其他线程之前完成吗?

时间:2015-08-12 19:59:48

标签: 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());
        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仅保持在可运行状态。如果这是可能的,我怎么能产生相同的?

感谢。

1 个答案:

答案 0 :(得分:5)

您正在寻找回答您问题的术语是“守护程序”线程。只要有非守护程序线程在运行,应用程序就不会终止,并且这些线程将能够运行到终止状态。

因此,在您的情况下,T5 ... T8将运行并完成,因为它们是非守护程序线程

来自Thread的文档:

  

当Java虚拟机启动时,通常会有一个非守护程序线程(通常调用某个指定类的名为main的方法)。 Java虚拟机继续执行线程,直到发生以下任一情况:

     

•已调用Runtime类的exit方法,并且安全管理器已允许执行退出操作。

     

•所有非守护程序线程的线程都已死亡,无论是通过调用run方法返回还是抛出一个超出run方法传播的异常

事实上,JVM启动的原始单一非守护程序线程可能会在T5 ... T8之前进入终止状态。在这种情况下,这不会阻止T5 ... T8运行完成。

相关问题