JAVA多线程(二):线程上下文切换、死锁及守护线程

说明:这篇博客是我读《JAVA并发编程之美》后的一个总结。如有侵权请联系删除。同时说明以下内容仅代表个人观点,如果有不清除或是有错误的地方,欢迎大家批评指正!!!

目录

 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!");
    }
}

该程序的运行结果如下

如果有不清楚或是错误的地方,欢迎大家下方留言一起讨论!!!同时该系列会持续分享,如果希望看到后续的内容也可以关注一下😁!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值