Java多线程学习笔记一
程序员文章站
2022-10-03 16:57:14
java多线程本文是记录在尚硅谷学习java的一些笔记,因为是第一篇可能大部分都是PPT的搬用,希望多多包涵,后续会继续更新,欢迎大家交流学习,如有不妥之处,欢迎多多评论...
本文是记录在尚硅谷学习java的一些笔记,因为是第一篇可能大部分都是PPT的搬用,希望多多包涵,后续会继续更新,欢迎大家交流学习,如有不妥之处,欢迎多多评论
线程的创建和使用
Java 语言的 JVM 允许程序运行多个线程,它通过 java.lang.Thread类来体现 。
Thread类的特性
- 每个线程都是通过某个特定Thread对象的run()方法来完成操作的,经常把run()方法的主体称为线程体
- 通过该Thread对象的start()方法来启动这个线程,而非直接调用run()
Thread类
构造器
- Thread():创建新的Thread对象
- Thread(String threadname):创建线程并指定线程实例名
- Thread(Runnable target):指定创建线程的目标对象,它实现了Runnable接口中的run方法
- Thread(Runnable target,String name):创建新的Thread对象
创建线程的两种方式
方式一:继承Thread类
- 定义子类继承Thread类
- 子类中重写Thread类中的run方法
- 创建Thread子类对象,即创建了线程对象
- 调用线程对象start方法:启动线程,调用run方法
- 注意点:
- 如果自己手动调用run()方法,那么就只是普通方法,没有启动多线程模式
- run()方法由JVM调用,什么时候调用,执行的过程控制都是操作系统的CPU调度决定
- 想要启动多线程,必须调用start方法
- 一个线程对象只能调用一次start()方法启动,如果重复调用了,则将抛出以上的异常"ILLegalThreadStateException"
方式二:实现Runnable接口
- 定义子类,实现Runnable接口
- 子类中重写Runnable接口中的run方法
- 通过Thread类含参构造器创建线程对象
- 将Runnable接口的子类对象作为实际参数传递给Thread类的构造器
- 调用Thread类的start方法:开启线程,调用Runnable子类接口的run方法
继承方式和实现方式的区别
- 区别
- 继承Thread:线程代码存放Thread子类run方法中
- 实现Runnable:线程代码存放在接口的子类的run方法
- 实现方式的好处
- 避免了单继承的局限性
- 多个线程可以共享同一个接口实现类的对象,非常适合多个相同线程来处理同一份资源
- 联系:public class Thread implements Runnable
- 相同点:两种方式都需要重写run(),将线程要执行的逻辑声明在run()中。
Thread类的有关方法
- start():启动当前线程;调用当前线程的run()方法
- run():通常需要重写Thread类中的此方法,将创建的线程要执行的操作声明在此方法中
- currentThread():静态方法,返回执行当前代码的线程
- getName():获取当前线程的名字
- setName():设置当前线程的名字
- yield():释放当前CPU的执行权
- join():在线程a中调用线程b的join(),此时线程a就进入阻塞状态,直到线程b完全执行完以后,线程a才结束阻塞状态
- stop():强制线程生命期结束,不推荐使用(已过时)
- sleep(long millitime):让当前线程“睡眠”指定的millitime毫秒。在指定的millitime毫秒时间内,当前线程是阻塞状态
- boolean isAlive():判断当前线程是否存活
线程的调度
线程的优先级
- 线程的优先级:
-> MAX_PRIORITY:10
-> MIN_PRIORITY:1
-> NORM_PRIORITY:5 - 涉及的方法
-> getPriority():返回线程优先级
-> setPriority(int newPriority): 改变线程的优先级 - 说明:
-> 线程创建时继承父线程的优先级
-> 低优先级只是获得调度的概率低,并不是一定在高优先级线程之后才被调用
线程的生命周期
-
JDK中用Thread.State类定义了线程的几种状态
想要实现多线程,必须在主线程中创建新的线程对象。Java语言使用Thread类及其子类的对象来表示线程,在它的一个完整的生命周期中通常要经历如下的五种状态:
-> 新建:当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态
-> 就绪:处于新建状态的线程被start()后,将进入线程队列等待CPU时间片,此时它已具备了运行的条件,只是没分配CPU资源
-> 运行:当就绪的线程被调用并获得CPU资源时,便进入运行状态,run()方法定义了线程的操作和功能
-> 阻塞:在某种特殊情况下,被人为挂起或执行输入输出操作时,让出CPU并临时中止自己的执行,进入阻塞状态
-> 死亡:线程完成了它的全部工作或线程被强制提前中止或出现异常导致结束
线程同步
线程安全
在Java中,我们通过同步机制,来解决线程安全问题。好处是可以解决线程的安全问题;局限性是操作同步代码块时,只能有一个线程参与,其他线程等待,相当于是一个单线程的过程,效率低
- 方式一:同步代码块
synchronized(同步监视器){
//需要被同步的代码
}
说明:操作共享数据的代码,即为需要被同步的代码
共享数据:多个线程共同操作的变量,比如:卖票例子中的ticket变量
同步监视器:俗称“锁”。任何一个类的对象都可以作为锁
要求:多个线程必须要公用同一把锁
本文地址:https://blog.csdn.net/weixin_40835901/article/details/107358773
上一篇: web.xml <context-param>配置详解
下一篇: JVM中堆、栈、方法区之间怎么交互