Java并发编程系列-04-线程的优先级
2020-02-12 09:55
351 查看
线程的优先级
- 在 Java中,线程优先级的范围是1~10,默认的优先级是5。
- "高优先级线程"会优先于"低优先级线程"执行。
线程优先级的特性
- 线程A启动线程B,线程A和B具有相同的优先级。
- CPU尽量将执行的资源让给优先级高的线程用,但是不一定优先级较大的线程先执行完。
- 即使线程设有优先级,并不能保证执行先后,线程运行具有随机性。
/** * @description: 线程的优先级 * @author: Cyril * @create: 2019/12/01 */ public class ThreadPriority { static class ThreadPriorityDemo1 extends Thread { @Override public void run() { super.run(); //线程的优先级 System.out.println("ThreadPriorityDemo1线程的优先级" + this.getPriority()); } } static class ThreadPriorityDemo2 extends Thread { @Override public void run() { super.run(); System.out.println("ThreadPriorityDemo2的线程优先级" + this.getPriority()); } } public static void main(String[] args) { ThreadPriorityDemo1 threadPriorityDemo1 = new ThreadPriorityDemo1(); threadPriorityDemo1.start(); Thread.currentThread().setPriority(10); //当前线程优先级设置位10,threadPriorityDemo2的线程优先级也会编程10 ThreadPriorityDemo2 threadPriorityDemo2 = new ThreadPriorityDemo2(); threadPriorityDemo2.start(); } }
/** * @description: 线程优先级执行的效率,线程优先级高的线程不一定先执行完 * @author: Cyril * @create: 2019/12/01 */ public class ThreadPriorityEfficiency { static class ThreadPriorityEfficiency1 extends Thread { @Override public void run() { long start = System.currentTimeMillis(); System.out.println("------1------ thread 1 start running"); long count = 0; for (int i = 0; i < 10; i++) { for (int j = 0; j < 50000; j++) { Random random = new Random(); random.nextInt(); count = count + i; } } long end = System.currentTimeMillis(); System.out.println("------1------ thread 1 use time = " + (end - start)); } } static class ThreadPriorityEfficiency2 extends Thread { @Override public void run() { long start = System.currentTimeMillis(); System.out.println("------2------ thread 2 start running"); long count = 0; for (int i = 0; i < 10; i++) { for (int j = 0; j < 50000; j++) { Random random = new Random(); random.nextInt(); count = count + i; } } long end = System.currentTimeMillis(); System.out.println("------2------ thread 2 use time = " + (end - start)); } } public static void main(String[] args) { for (int i = 0; i < 5; i++) { ThreadPriorityEfficiency1 threadPriorityEfficiency1 = new ThreadPriorityEfficiency1(); threadPriorityEfficiency1.setPriority(1); ThreadPriorityEfficiency2 threadPriorityEfficiency2 = new ThreadPriorityEfficiency2(); threadPriorityEfficiency2.setPriority(10); //线程优先级分别设置位1、10,线程threadPriorityEfficiency2执行时间也会高于threadPriorityEfficiency1的执行时间 threadPriorityEfficiency1.start(); threadPriorityEfficiency2.start(); } } }
守护线程
Java中的线程分为2种:用户线程和守护线程。
用户线程:执行用户级的任务。- Java虚拟机在"用户线程"都结束后会退出。
- 守护线程是指在程序运行的时候在后台提供一种通用服务的线程。
- 守护线程并不属于程序中不可或缺的部分。如垃圾回收线程。
- 当所有的用户线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。
怎么设置线程为守护线程。
- 守护线程并非只有虚拟机内部特有的。
- Thread.setDaemon()方法可以设置守护线程。
- 如果想设置线程有守护线程,必须在线程运行前设置,
否则会抛IllegalThreadStateException异常。 - 守护线程创建的子线程也是守护线程。
如何判断一个线程是守护线程?
isDaemon()方法来区分:如果返回false,则说明该线程是“用户线程”;否则就是“守护线程”
/** * @description: * @author: Cyril * @create: 2019/12/01 */ public class DaemonThreadDemo { public static void main(String[] args) { Thread t1 = new CommonThread(); Thread t2 = new Thread(new MyDaemon()); // 抛异常 :IllegalThreadStateException // t2.start(); //设置为守护线程 t2.setDaemon(true); // 正确做法:线程运行前设置守护线程 t2.start(); t1.start(); } /** * 普通用户线程 */ static class CommonThread extends Thread { @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println("用户线程第" + i + "次执行!"); try { Thread.sleep(10); } catch (Exception e) { e.printStackTrace(); } } } } /** * 守护线程 */ static class MyDaemon implements Runnable { @Override public void run() { for (long i = 0; i < 9999999; i++) { System.out.println("守护线程第" + i + "次执行!"); try { Thread.sleep(10); } catch (Exception e) { e.printStackTrace(); } } } } }
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- Java多线程系列--“基础篇”10之 线程优先级和守护线程
- Java多线程系列--“基础篇”10之 线程优先级和守护线程
- Java多线程系列(8)--线程优先级和守护线程(后台线程)
- Java并发编程系列之七:线程状态
- Java并发编程系列之二十九:正确终止与恢复线程(续)
- Java 并发编程:线程间的协作(wait/notify/sleep/yield/join) Java并发编程系列: Java 并发编程:核心理论 Java...
- 线程的调度、优先级和亲缘性——Windows核心编程学习手札系列之七
- Java并发编程系列之七:正确终止与恢复线程
- java并发编程-1.2线程信息获取和设置(ID,名称、优先级、状态)
- 线程系列04,传递数据给线程,线程命名,线程异常处理,线程池
- [叩响C#之门]写给初学者:多线程系列(三)——线程的优先级
- Java多线程系列--“基础篇”10之 线程优先级和守护线程
- ava多线程系列-- 之 线程优先级和守护线程
- Java多线程系列--“基础篇”10之 线程优先级和守护线程
- 多线程—04—守护线程、interrupt、join、yield、线程优先级
- Java多线程系列--“基础篇”10之 线程优先级和守护线程
- 多线程系列 - 基础篇01 - 线程基本概念 & 线程优先级 & 守护线程 60%
- Java并发编程系列-(7) Java线程安全
- C# 多线程学习系列三:线程优先级、线程同步以及向线程传递参数
- java 多线程系列基础篇(十)之线程优先级和守护线程