第三百一十八节 Java线程教程 - Java线程优先级、Java守护线程
Java线程教程 - Java线程优先级
所有线程都有优先级。
优先级由1到10之间的整数表示。
优先级为1的线程优先级最低。优先级为10的线程具有最高优先级。
在Thread类中定义了三个常量来表示下表中列出的三个不同的线程优先级。
线程优先级常量 | 整数值 |
---|---|
MIN_PRIORITY | 1 |
NORM_PRIORITY | 5 |
MAX_PRIORITY | 10 |
具有较高优先级的线程应该有更多的CPU时间。
线程的优先级只是调度器的一个提示。
Thread类的setPriority()方法为线程设置了新的优先级。
getPriority()方法返回线程的当前优先级。
创建线程时,其优先级设置为创建线程的优先级。
例子
以下代码演示如何设置和获取线程的优先级。
public class Main { public static void main(String[] args) { Thread t = Thread.currentThread(); System.out.println("main Thread Priority:" + t.getPriority()); Thread t1 = new Thread(); System.out.println("Thread(t1) Priority:" + t1.getPriority()); t.setPriority(Thread.MAX_PRIORITY); System.out.println("main Thread Priority:" + t.getPriority()); Thread t2 = new Thread(); System.out.println("Thread(t2) Priority:" + t2.getPriority()); // Change thread t2 priority to minimum t2.setPriority(Thread.MIN_PRIORITY); System.out.println("Thread(t2) Priority:" + t2.getPriority()); } }
上面的代码生成以下结果。
Java线程教程 - Java守护线程
线程可以是守护线程或用户线程。
守护线程是服务提供者线程。
当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(); } } } }
上面的代码生成以下结果。
例2
以下代码将线程设置为非守护线程。由于这个程序有一个非守护线程,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(); } } } }
上面的代码生成以下结果。
原文地址:https://blog.csdn.net/2301_78772942/article/details/143673204
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!