Java教程

JAVA多线程⑦

本文主要是介绍JAVA多线程⑦,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

多线程⑦

  • 线程的生命周期及状态转换
  • 线程的优先级
  • 同步代码块
  • 死锁

个人笔记⑦

线程的生命周期及状态转换

当线程被创建以后,它不是一启动(start)就进入运行
状态的,也不是一直处于执行状态。在线程的生命周期
中,它要经过创建(New)、就绪(Runnable)、运行
(Running)、阻塞(Blocked)和死亡(Dead)这五
种状态。当线程进入运行状态后,它不是一直“霸占”
CPU运行,一般的操作系统是采用抢占式的方式来让线
程获得CPU。所以CPU需要在多条线程之间切换,于是
线程状态也会多次在运行、阻塞、就绪之间切换。

Java线程具有五种基本状态

新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread();

就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行;

运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就 绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;

阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才 有机会再次被CPU调用以进入到运行状态。根据阻塞产生的原因不同,阻塞状态又可以分为三种:

死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

Java多线程的就绪、运行和死亡状态

就绪状态转换为运行状态:当此线程得到处理器资源;
运行状态转换为就绪状态:当此线程主动调用yield()方法或在运行过程中失去处理器资源。
运行状态转换为死亡状态:当此线程线程执行体执行完毕或发生了异常。

线程生命周期图

在这里插入图片描述

线程的优先级

Java线程可以有优先级的设定,高优先级的线程比低优先级的线程有更高的几率得到执行

1.记住当线程的优先级没有指定时,所有线程都携带普通优先级。
2.优先级可以用从1到10的范围指定。10表示最高优先级,1表示最低优先级,5是普通优先级。
3.记住优先级最高的线程在执行时被给予优先。但是不能保证线程在启动时就进入运行状态。
4.与在线程池中等待运行机会的线程相比,当前正在运行的线程可能总是拥有更高的优先级。
5.由调度程序决定哪一个线程被执行。
6.t.setPriority()用来设定线程的优先级。
7.记住在线程开始方法被调用之前,线程的优先级应该被设定。
8.你可以使用常量,如MIN_PRIORITY,MAX_PRIORITY,NORM_PRIORITY来设定优先级。

在这里插入图片描述

同步代码块

当动作需要同时执行(如售票),使用多线程时。发生了线程安全问题,出现错误。

线程任务中在操作共享的数据,或者线程任务操作共享数据的代码有多条(运算有多个)。

解决思路:在执行过程中不让其他线程执行
JAVA面对此问题通过代码块。即同步代码块来解决。

同步好处:解决多线程安全问题
同步缺点:降低程序性能
同步前提:必须保证多个线程在同步中使用同一个锁

在这里插入图片描述
在这里插入图片描述

死锁

当线程出现多个同步(多个锁),如果同步嵌套其他同步,这时容易引发死锁。
以下四种情况同时发生才会出现死锁

1.互斥:共享资源只能同时被一个线程占用
2.占用且等待:拿到了worker锁,不释放但去申请money锁;
3.不可抢占:线程Thread1拿到对象锁X之后,其他线程无法强行抢占X锁。
4.循环等待/(循环占有):线程T1拿到了资源X的锁,去申请Y的锁

这篇关于JAVA多线程⑦的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!