多线程知识点梳理1

1.什么是线程

线程(thread)是操作系统能够调度的最小的单位,它包含在进程内。是进程的实际运作单位。一个进程中可以有多个线程。

2.线程的生命周期

线程的生命周期一共分为五个部分:新建,就绪,运行,阻塞,死亡。 在这里插入图片描述
当线程被创建之后并不是直接执行状态,也不是一直处于执行状态。总要经历线程的五个状态:新建,就绪,运行,阻塞,死亡。
生命周期的五种状态:
1)新建(new Thread):新建线程的方法:继承Thread类并重写run方法,实现Runnable接口并重写run()方法,使用FutureTask方式三种。
2)就绪(runnable):线程已被启动,正在等待被分配给CPU时间片。也就是说此时线程在就绪队列里排队等待分配CPU资源。
3)运行(running):线程获得CPU资源正在执行任务。(run()方法),此时除非线程自动放弃CPU资源,或者有更高级的线程进入,否则线程会一直运行到结束。
4)阻塞(blocked):由于某种原因导致正在运行的线程暂停运行并让出CPU资源,进入阻塞状态。
休眠(sleep(long t)):线程休眠一定时间,当这个时间过去之后,线程会自动进入就绪状态。
等待(wait()):调用wait()方法使线程进入等待状态,此时线程不会自动被唤醒,需要notify(),notifyAll()方法唤醒。
5)死亡(dead):当线程执行完毕,或者线程被其他线程杀死,线程就进入死亡状态,此时线程不能再进入就绪状态等待执行。
·join方法:此外,在项目实践中经常会遇到一个场景,就是需要等待某几件事情完成后才能继续往下执行,比如:多个线程加载资源,需要多个线程全部加载完毕之后再汇总处理。Thread类中有一个join方法可以实现。join方法使由Thread类直接提供的。join是无参且返回值为void的方法。
·让出CPU执行权的yield方法:Thread类中有一个静态的yield方法:当一个线程调用yield方法时,实际就是在暗示线程调度器当前线程请求让出自己的CPU使用,但是线程调度器可以无视掉这个暗示。当一个线程调用yield方法时,当前线程会让出CPU使用权,然后处于就绪状态,线程调度器会从线程就绪队列里面获取一个优先级最高的线程,当然也有可能调度到刚刚让出CPU资源的线程来执行。
·线程中断:Java的线程中断是一种线程间的协作模式,通过设置线程的中断标志并不能直接终止该线程的执行,而是被中断的线程根据中断状态自行处理。
·void interrupt()方法:中断线程,只是添加一个中断标志,线程实际上没有中断,还是会继续往下执行。(注意:如果线程A因为调用了wait系列函数,join方法或者sleep方法而阻塞被挂起,这时候其他线程调用A线程的interrupt()方法,线程A会在调用这些方法的地方抛出InterruptedException异常而返回。)
·boolean isInterrupted()方法:检测当前线程是否被中断,如果是则返回true,否则返回false。
·boolean interrupted()方法:检测当前线程是否被中断,如果是则返回ture,否则返回false。与isInterrupted()方法的区别是,interrupted()发现当前线程被中断,则会清除中断标志,并且该方法时static方法,可以通过Thread类直接调用。

3.理解线程上下文切换

  • 在多线程编辑中,线程的个数一般都是大于CPU的个数的,而每一个CPU在同一时间只能被一个线程使用,为了让用户感觉同一时间多个线程在同时执行,CPU的资源分配采用了时间轮转片的策略,也就是给每一个线程分配一个时间片,线程在时间片内占用CPU来执行任务,当前线程使用完时间片后,就会处于就绪状态并让出CPU来让其他线程占用,这就是上下文切换,从当前线程的上下文切换到其他的线程。切换线程上下文的时候需要保存当前线程的执行现场,当再次执行时根据保存的执行现场信息来恢复执行现场。

4.线程死锁

死锁是指两个或者两个以上的线程在执行过程中,因争夺资源而造成的相互等待的现象。
死锁产生必须具备以下四个条件:
·互斥条件:指线程对已经获取到的资源进行排他性使用,即该资源同时只能有一个线程占用。如果此时还有其他线程请求获取资源,则请求者只能等待,直到占有资源的线程释放资源。
·请求并持有条件:指一个线程A已拥有了一个资源,但此时又请求另外一个新的资源请求,而请求的新资源被其他线程B拥有,所以当前线程A进入阻塞状态,但是又没有释放掉自己拥有的资源。
·不可剥夺条件:指线程获取的资源在自己使用完成前,不能被其他线程抢占,只能由自己使用完毕后或者其他操作让出资源。
·环路等待条件:指发生死锁时,必然存在一个线程-资源的环形链,即线程集合{T0,T1,T2,…Tn}中的的T0正在等待T1占用的资源,T1在等待T2的资源,…Tn在等待被T0占用的资源。
如何避免死锁?
要想避免死锁,只需要破坏掉至少一个构成死锁的必要条件即可,目前只有请求并持有和环路等待条件是可以破坏的。
造成死锁的原因其实和申请资源的顺序有很大的关系,使用资源申请的有序性原则就可以避免死锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值