Java 主方法关闭后线程如何运行?

Java 主方法关闭后线程如何运行?,java,multithreading,Java,Multithreading,以下是我的两门课: public class Firstclass { public static void main(String args[]) throws InterruptedException { System.out.println("Main start...."); Secondclass t1 = new Secondclass(); t1.setName("First Thread"); Secondc

以下是我的两门课:

public class Firstclass {
    public static void main(String args[]) throws InterruptedException {
        System.out.println("Main start....");
        Secondclass t1 = new Secondclass();
        t1.setName("First Thread");
        Secondclass t2 = new Secondclass();
        t2.setName("Second Thread");
        t1.start();
        t2.start();
        System.out.println("Main close...");
    }
}

我的第一个问题是:我想知道为什么即使
main
方法已经完成,两个线程仍然在运行

我的第二个问题是:有人能给我解释一下方法
join
synchronized
之间的区别吗

我想知道,即使主方法是关闭的,但它们是如何实现的 线程还在运行吗

您的
main()
方法由一个单独的线程运行,该线程启动另外两个线程(
First
ad
Second
)。并非所有线程都相互依赖,因此,主线程可以打印其他线程起始线以下的行

我的第二个问题是,有人能解释一下有什么区别吗 连接方法和同步方法之间

join()
表示等待线程完成。这是一个拦截器方法。synchronized是一个关键字,表示多线程不能同步访问同步块/方法

我想知道,即使主方法是关闭的,但它们是如何实现的 线程还在运行吗

一旦最后一个非JVM线程终止,JVM将退出。这意味着,如果您创建的任何线程仍在运行,jvm将不会关闭。守护进程线程是不阻止JVM关闭的线程。通常情况下,您会将它们用于一些后台任务,如果用户请求关闭应用程序,您不想让应用程序继续运行

守护进程线程是一个线程,当程序完成但线程仍在运行时,它不会阻止JVM退出。守护进程线程的一个例子是垃圾收集

您可以使用
setDaemon()
方法更改线程守护程序属性。默认情况下,用户创建的每个线程都是普通(非守护进程)线程,除非显式调用
setDaemon()
方法

解释一下join方法和join方法的区别是什么 同步的


同步是一种锁定机制,它允许两个线程不相互干涉,即同步用于在锁定机制的帮助下提供多个线程对共享资源的正确访问。
另一方面
join()
方法调用允许一个线程等待另一个线程完成

您的
main
线程未关闭-

      // ...
      System.out.println("Main close...");
      // <--- Your main method is here while all the other threads complete (sort of).
     }
/。。。
System.out.println(“主关闭…”);
//加入
如果有一个线程B在另一个线程a完成其工作之前无法完成其工作,那么您希望线程B“加入”线程a

已同步 当我们使用线程时,我们通常需要在某个地方使用一些同步来 确保我们的方法不会在错误的时间互相打断,并扰乱我们的工作 数据。通常,任何时候都有多个线程在访问可变(可变)线程 数据,您可以同步以保护该数据,以确保两个线程不发生更改 它在同一时间(或者一个在另一个在同一时间没有改变它)
阅读它,这也是令人困惑的。)

有两种类型的线程用户和守护进程。因此,如果希望程序退出,请将线程设置为守护进程

范例

Thread t = new Thread();
t.setDaemon(true);
当没有更多的用户线程时,进程终止

关于你的第二个问题:

Join仅在您需要确保线程死亡时使用&之后您无事可做

同步用于线程间通信

您的第一个问题

默认情况下调用main方法时,将创建一个主线程。主线程是非dameon线程。当主方法创建线程时,它将继承它的parant属性。这意味着它们都是非守护进程线程。正如您所知,JVM等待所有非守护进程线程完成。因此,即使在主线程完成后,它也会执行

请看这里:

第二个问题: join方法在调用join方法的线程的末尾连接当前运行的线程。这意味着当前线程将停止,并在join方法引用的线程之后启动


同步会停止两个线程同时执行相同的代码。

如果您想在主方法完成后退出,请创建您的线程守护程序。现在,我正式感到困惑,因为其他人回答说,主线程在每一个线程死后就死了,而您说的是主方法死了,还有其他线程死了执行.main线程不会等到它的所有子线程完成。请参阅我的文章中的示例证明。您是说,主要方法是在线程t1和t2完成后终止。我是说,JVM进程在t1和t2完成之前不会终止。主方法将消失。你可以通过调用join方法让它等待t1和t2。你说如果我创建线程守护进程,那么main method()就会消亡,在上述情况下,所有的方法都是用户方法,那么main method什么时候会消亡?@Sivaranjani D的说法正好相反。请告诉我他怎么错了?-1。方法
main
不会等到所有线程都完成,除非您显式使用
join
。在所有用户线程完成之前,JVM不会结束进程。@TruePS-因为
main
方法是由主线程调用的。
main
方法完成,但
main
线程将等待它创建的所有其他非守护进程线程都死机后再退出VM。@TruePS由于Java是托管语言,所以所有二进制代码都在Java虚拟机上执行,该虚拟机跟踪当前正在运行的线程和正在运行的线程守护进程线程等。从主线程派生的线程不被视为主线程的“子线程”,而是作为独立线程执行,由
      // ...
      System.out.println("Main close...");
      // <--- Your main method is here while all the other threads complete (sort of).
     }
Thread t = new Thread();
t.setDaemon(true);