线程的优先级、守护线程

线程的优先级、守护线程_第1张图片

 一. 线程的优先级

在计算机当中,线程的调度有两种方式:

  1. 抢占式调度模型多个线程它是在抢夺CPU的执行权,CPU在什么时候执行哪条线程是不确定的,执行多长时间也是不确定的,所以抢占式调度它体现了一个随机性。优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些。
  2. 非抢占式调度 / 分时调度模型所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片 。那就是所有的线程轮流的执行,你一次我一次,你一次我一次,执行的时间也是差不多的
  • 在Java当中,它采取了第一种抢占式调度模型的方式。抢占式调度,重点掌握两个字随机性。
  • 假如计算机只有一个 CPU,那么 CPU 在某一个时刻只能执行一条指令,线程只有得到CPU时间片,也就是使用权,才可以执行指令所以说多线程程序的执行是有随机性,因为谁抢到CPU的使用权是不一定的。
  • 优先级越大,那么这条线程抢到CPU的概率就是最大的。
  • 在Java当中线程的优先级分为十档,最小的是一,最大的是十,如果没有设置默认就是五。
  • 优先级越高,只能保证它抢到CPU时间片的概率是最大的,但不能保证百分之百抢到CPU的执行权,它只是一个概率问题。
  • 线程的执行它是随机性的。

线程的优先级、守护线程_第2张图片

package com.gch.d2_api;
/**
   线程任务类
 */
public class MyRunnable implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + "----" + i);
        }
    }
}
package com.gch.d2_api;

public class ThreadDemo03 {
    public static void main(String[] args) {
        /*
              setPriority(int newPriority)   设置线程的优先级
              final int getPriority          获取线程的优先级
         */
        // 创建线程要执行的参数对象
        Runnable target = new MyRunnable();
        // 创建线程对象
        Thread t1 = new Thread(target,"飞机");
        Thread t2 = new Thread(target,"坦克");

        System.out.println(t1.getPriority()); // 5
        System.out.println(t2.getPriority()); // 5

        // 虚拟机自己创建的main线程的优先级,也是5
        System.out.println(Thread.currentThread().getPriority()); // 5


        t1.setPriority(1);
        t2.setPriority(10);
        t1.start();
        t2.start();
    }
}
  •  飞机的优先级为1,坦克的优先级为10,而飞机还先执行完!

线程的优先级、守护线程_第3张图片

二. 守护线程(备胎线程)

package com.gch.d9_thread_daemon;

public class MyThread1 extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(getName() + "@" +i);
        }
    }
}
package com.gch.d9_thread_daemon;

public class MyThread2 extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(getName() + "@" + i);
        }
    }
}
package com.gch.d9_thread_daemon;

import com.gch.d2_api.MyThread;

public class ThreadDemo {
    public static void main(String[] args) {
        /*
             final void setDaemon(boolean on)   设置为守护线程
             细节:
                  当其他的非守护线程(女神线程)执行完毕后,守护线程(备胎线程)会陆续结束
             通俗易懂:
                     当女神线程结束了,那么备胎也没有存在的必要了
         */

        Thread t1 = new MyThread1();
        Thread t2 = new MyThread2();

        t1.setName("女神");
        t2.setName("备胎");

        // 把第二个线程设置为守护线程(备胎线程)
        t2.setDaemon(true);

        t1.start();
        t2.start();
    }
}

 线程的优先级、守护线程_第4张图片

 守护线程的应用场景:当把聊天都关闭了,传输文件也就没有存在的必要了!

线程的优先级、守护线程_第5张图片

 问题:主线程执行完,子线程也一定结束吗?

  • 答:这取决于子线程是否是守护线程,如果子线程是守护线程,它将在主线程退出时终止,但是,如果子线程是非守护线程,那么即使在主线程退出后,子线程仍将继续执行。

你可能感兴趣的:(java,jvm,开发语言)