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

这是我的两个class级:

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..."); } } 

 public class Secondclass extends Thread { @Override public void run() { try { loop(); } catch(Exception e) { System.out.println("exception is" + e); } } public void loop() throws InterruptedException { for(int i = 0; i <= 10; i++) { Thread t = Thread.currentThread(); String threadname = t.getName(); if(threadname.equals("First Thread")) { Thread.sleep(1000); } else { Thread.sleep(1500); } System.out.println("i==" + i); } } } 

现在,当我运行Firstclass ,输出是:

 Main start.... Main close... i==0 i==0 i==1 i==1 i==2 i==3 i==2 i==4 i==3 i==5 i==6 i==4 i==7 i==5 i==8 i==9 i==6 i==10 i==7 i==8 i==9 i==10 

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

我的第二个问题是:任何人可以向我解释方法joinsynchronized之间的区别是什么?

你的main未关闭 –

  // ... System.out.println("Main close..."); // <--- Your main method is here while all the other threads complete (sort of). } 

在您的问题的第2部分 - 连接和synchronized之间没有连接。 它们几乎相反。

  • join - 在恢复之前等待线程完成。
  • synchronized - 只有一个线程可以进入此处,其他线程必须等待。

我想知道即使main方法已关闭,两个线程仍在运行?

一旦最后一个非jvm线程终止,JVM将退出。 这意味着如果您创建的任何线程仍在运行,则jvm将不会关闭。 守护程序线程是不阻止JVM关闭的线程。 通常你会将它们用于某些后台任务,如果用户要求它关闭,你不希望保持你的应用程序。

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

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

解释一下join方法和synchronized之间有什么区别

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

你的第一个问题,

默认情况下调用main方法时会创建一个主线程。 主线程是非dameon线程。 当main方法创建的线程inheritance它的parant属性时。 这意味着它们都是非守护程序线程。 如您所知,JVM等待所有非守护程序线程完成。 所以它甚至会在主线程完成后执行。

请参阅此处: 每个线程创建的 守护程序与非守护程序 Java堆栈

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

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

我想知道即使main方法已关闭,两个线程仍在运行?

你的main()方法是由一个单独的线程运行的,它开始另外两个线程( First广告Second )。 所有线程不相互依赖,因此,主线程可以打印其他线程起始行下面的行。

我的第二个问题是,任何人都可以解释一下join方法和synchronized之间的区别是什么?

join()表示等待线程完成。 这是一种阻止方法。 synchronized是一个关键字,表示multithreading无法同步访问同步块/方法。

如果你有一个线程B在另一个线程A完成其工作之前无法完成其工作,那么你希望线程B“加入”线程A.

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

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

 Thread t = new Thread(); t.setDaemon(true); 

当没有更多用户线程时,该进程终止。

至于你的第二个问题:

只有在需要确保线程死亡且之后无所事事时才使用Join

同步用于线程间通信