线程优先级【应用】
- 线程调度
- 两种调度方式
- 分时调度模型:所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片
- 抢占式调度模型:优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些。优先级越高抢到CPU的几率就越高
- Java使用的是抢占式调度模型
- 随机性
假如计算机只有一个 CPU,那么 CPU 在某一个时刻只能执行一条指令,线程只有得到CPU时间片,也就是使用权,才可以执行指令。所以说多线程程序的执行是有随机性,因为谁抢到CPU的使用权是不一定的
- 优先级相关方法
方法名 | 说明 |
final int getPriority() | 返回此线程的优先级 |
final void setPriority(int newPriority) | 更改此线程的优先级线程默认优先级是5;线程优先级的范围是:1-10 |
- 代码演示
public class MyCallable implements Callable<String> { @Override public String call() throws Exception { for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + "---" + i); } return "线程执行完毕了"; } } public class Demo { public static void main(String[] args) { //优先级: 1 - 10 默认值:5 MyCallable mc = new MyCallable(); FutureTask<String> ft = new FutureTask<>(mc); Thread t1 = new Thread(ft); t1.setName("飞机"); t1.setPriority(10); //System.out.println(t1.getPriority());//5 t1.start(); MyCallable mc2 = new MyCallable(); FutureTask<String> ft2 = new FutureTask<>(mc2); Thread t2 = new Thread(ft2); t2.setName("坦克"); t2.setPriority(1); //System.out.println(t2.getPriority());//5 t2.start(); } /* 一个发现的可能不用的点,创建两个线程用相同的 FutureTask 对象的话,让两个线程对象start,那么只会有一个执行。但是用两个不同的 FutureTask 对象,但这两个对象用相同的 Callable 对象的话是会有两个线程都start的 */ }
##守护线程【应用】
线程分为:用户线程和守护线程(主线程也属于用户线程)
守护线程(即daemon thread),是个服务线程,准确地来说就是服务用户线程。
当用户线程都执行完毕退出了的时候,守护线程也就没必要存在了,那么守护线程也会退出
就比如垃圾回收线程就是典型的守护线程
- 相关方法
方法名 | 说明 |
void setDaemon(boolean on) | 将此线程标记为守护线程,当运行的线程只有守护线程时,Java虚拟机将退出 |
- 代码演示
public class MyThread1 extends Thread { @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(getName() + "---" + i); } } } public class MyThread2 extends Thread { @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println(getName() + "---" + i); } } } public class Demo { public static void main(String[] args) { MyThread1 t1 = new MyThread1(); MyThread2 t2 = new MyThread2(); t1.setName("女神"); t2.setName("备胎"); //把第二个线程设置为守护线程 //当普通线程执行完之后,那么守护线程也没有继续运行下去的必要了. t2.setDaemon(true); t1.start(); t2.start(); } }
当然,并不是所有非守护线程执行完后守护线程就立马停止,因为守护线程占着 cpu 的话,cpu 执行又非常快,守护线程可能还会执行一些代码才停