目录

 1. 线程上下文切换

什么是线程上下文切换?

线程上下文切换的时机有哪些?

2. 死锁

什么是死锁

死锁产生的条件

怎么避免死锁

3.守护线程


 1. 线程上下文切换

什么是线程上下文切换?

    在我们的电脑上运行着很多的线程,线程的数量往往是大于CPU的数量的,而一个CPU同一时刻只能被一个线程占用。为了让我们感觉多线程是同时执行的,CPU采用时间片轮转机制,每个线程分配相应的时间片,时间片结束时需要保存当前线程的运行状态,然后转换为就绪态,这就是线程上下文切换。

线程上下文切换的时机有哪些?

以下情况会发生线程上下文切换:

    a.当前线程的时间片用完。

    b.当前线程在运行的过程中被其他线程打断了。

2. 死锁

什么是死锁

    死锁:两个线程互相持有对方所需要的锁的同时希望获取对方持有的锁而造成程序无法继续运行。

死锁产生的条件

    a.互斥条件:线程对获取到的资源是排他性使用的,即只能自己使用,其他线程无法使用。

    b.请求并持有条件:指的是当前线程已经持有至少一个资源的同时去请求其他资源。

    c.不可剥夺条件:指线程在使用完已持有的资源前,其他线程无法抢占。

    d.环路等待:指的是发生死锁的情况下,一定存在一个“线程———资源”的环形链。如A线程等B线程占用的资源,而B线程在等A线程占用的资源。

怎么避免死锁

对多个线程请求获取相同的多个共享资源进行排序,即多个线程请求获取多个共享资源的顺序是一定的,那么讲不会存在这两种情况了,自然可以避免死锁的产生。

3.守护线程

    JAVA中的线程分为daemon线程(守护线程)和user线程(用户线程)。比如:在JVM启动时调用main函数,其中main函数所在的线程就是一个用户线程,而与此同时JVM内部同时启动了好多守护线程。如:垃圾回收线程。

    守护线程的特点:当最后一个非守护线程结束的后,JVM会正常退出。此时不论守护线程是否执行完毕都会结束。

    创建守护线程的方法如下(同时包含对于其特点的测试)

public class CreateDaemonThread {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("Daemon thread begin!");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("Daemon thread end!");
            }
        });
        // 设置thread线程为守护线程,默认为false。
        thread.setDaemon(true);
        thread.start();
        // 让主线程睡0.5秒代表主线程的工作
        Thread.sleep(500);
        System.out.println("Main thread end!");
    }
}

该程序的运行结果如下

java 上下文切换 java多线程上下文切换_java