Java守护线程和普通线程是Java多线程的两个重要概念,它们之间有很多不同之处。
首先,它们的启动方式不同。普通线程是由Thread.start()方法来启动的,而守护线程是由Thread.setDaemon(true)来设置为守护进程,然后再调用Thread.start()方法来启动。
其次,它们的优先级也不一样。普通线程的优先级默认为5,而守护进程的优先级默认为1。
此外,它们在JVM中的存在也有所不同。当JVM中只剩下守护进程时,JVM将会退出;而当JVM中只剩下普通进行时,JVM将不会退出。
public class DaemonThreadTest { public static void main(String[] args) { Thread thread = new Thread(new Runnable() { @Override public void run() { while (true) { System.out.println("I am a daemon thread"); } } }); // 设置为守护进行 thread.setDaemon(true); // 将该进行设为守护进行 thread.start(); // 启动该进行 } }
线程可以是守护线程或用户线程。
守护线程是服务提供者线程。
当JVM检测到应用程序中的所有线程都只是守护线程时,它将退出应用程序。
我们可以通过使用setDaemon()方法通过传递true作为参数,使线程成为一个守护线程。
我们必须在启动线程之前调用一个线程的setDaemon()方法。否则,一个java.lang。抛出IllegalThreadStateException。
我们可以使用isDaemon()方法来检查线程是否是守护线程。
创建线程时,其守护程序属性与创建线程的线程相同。
以下代码创建一个线程并将线程设置为守护线程。
public class Main { public static void main(String[] args) { Thread t = new Thread(Main::print); t.setDaemon(true); t.start(); System.out.println("Exiting main method"); } public static void print() { int counter = 1; while (true) { try { System.out.println("Counter:" + counter++); Thread.sleep(2000); // sleep for 2 seconds } catch (InterruptedException e) { e.printStackTrace(); } } } }
上面的代码生成以下结果。
以下代码将线程设置为非守护线程。由于这个程序有一个非守护线程,JVM将继续运行应用程序,即使在main()方法完成后。
您必须强制停止此应用程序,因为线程在无限循环中运行。
public class Main { public static void main(String[] args) { Thread t = new Thread(Main::print); t.setDaemon(false); t.start(); System.out.println("Exiting main method"); } public static void print() { int counter = 1; while (true) { try { System.out.println("Counter:" + counter++); Thread.sleep(2000); // sleep for 2 seconds } catch (InterruptedException e) { e.printStackTrace(); } } } }
上面的代码生成以下结果。
Java线程教程 -Java Fork/Join框架fork/join框架通过利用机器上的多个处理器或多个内核来解决问题。该框架有助于解决涉及并行性...
Java网络教程 -Java数据报套接字通道java.nio.channels.DatagramChannel类表示数据报通道。默认情况下,它是阻塞。要使其无阻塞...
JavaFX教程 -JavaFX超链接超链接类表示类似于JavaFX的网页上的锚链接的超链接。import javafx.application.Application;import j...