Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程连接方法。主线程能否在其他线程之前完成?_Java_Multithreading - Fatal编程技术网

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是否仍处于可运行状态,这只是问题的一部分。