Java多线程

本文详细介绍了Java中的线程概念,包括进程与线程的区别,线程的创建方式(通过Thread类继承和实现Runnable接口),以及线程的生命周期和状态转换。此外,还探讨了线程调度的模型(分时调度和抢占式调度),线程的优先级和控制方法如sleep()、yield()和join()。最后,重点讨论了多线程同步的重要性,同步代码块和同步方法的使用,以避免并发问题。
摘要由CSDN通过智能技术生成

 1.线程概述

进程:在一个操作系统中,每一个独立执行的程序都可以称为一个进程

线程:在一个进程中还可以有多个执行单元同时运行,这些执行单元可以看作程序执行的一条条线索,称为线程

2.线程的创建 

多线程实现方式 :

①:继承·Java.lang包下的Thread类,覆写Thread类的run()方法,在run()方法中实现运行在线程上的代码

②:实现java.lang.Runnable接口,重写run()方法,在测试类创建对象并调用Thread有参构造创建线程对象再调用start方法开启线程 

3.实现Runnable接口创建多线程

 Runnable接口相对于Thread类的优势:

(1) 适合多个相同程序代码的线程去处理同一个资源的情况下,把线程同代码、数据有效分离,很好地体现了面向对象的思想

(2)可以避免由于java的单继承带来的局限性。在开发中经常遇到这样一种情况,即使用一个已经就继承了某一个类的子类创建线程,由于一个类不能同时有两个父类,因此不能使用继承Thread类的方式,只能采用实现Runnable接口的方式

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

线程的五个生命周期:

新建状态(New)、就绪状态(Runnable)、运行状态(Running)、阻塞状态(Blocked)、死亡状态(Terminated)

线程状态转换图 

 

 新建状态:创建一个线程对象后,该线程对象就处于新建状态,它此时仅仅由Java虚拟机分配了内存,没有任何线程的动态特征
  就绪状态:当线程对象调用了start后,该线程就进入了就绪状态,位于线程队列中,具备运行的条件,能否获取CPU的使用权并开始运行,需等待系统的调度
  运行状态:如果处于就绪状态的线程获取了CPU的使用权并开始执行run方法中的线程执行体,那该线程就处于运行状态
  阻塞状态:一个正在执行的线程在某些特殊情况下,会让出CPU的使用权并暂时中止自己的执行,进入到阻塞状态
  死亡状态:如果线程调用stop方法或者run方法执行完毕,又或者是线程抛出了一个未捕获的异常、错误,那该线程就进入了死亡状态
 

5.线程的调度

概述:Java虚拟机会按照特定的机制为程序的每一个线程分配CPU的使用权,这种机制称为线程的调度

线程调度的两种模型:分时调度模型、抢占式调度模型

 分时调度模型:让所有的线程轮流获得CPU的使用权,并且平均分配每个线程占用CPU的时间片

抢占式调度模型:让运行池中优先级高的线程优先占用CPU,而对于优先级相同的线程,随机选择一个线程使其占用CPU,它失去了CPU的使用权后,再随机选择其他线程获取CPU使用权

线程的优先级:1-10,值越大优先级越高(只是获取CPU的概率增大,并不是一定能获取CPU使用权)

线程的休眠:sleep()

线程让步:yield()

线程插队:join()

6.多线程同步

容易出现Bug 

同步代码块的语法格式:

synchronized(lock){

操做共享资源代码块

}

 同步方法的语法格式:

synchronized 返回值类型 方法名([参数1,....])  { } 

 

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值