多线程相关

本文介绍了多线程的概念,进程与线程的区别,线程的创建方式,包括继承Thread、实现Runnable接口和Callable接口,详细阐述了线程的状态转换及常用方法。还讨论了线程的死锁问题及其四个必要条件,并提出了预防死锁的策略。

多线程

  1. 什么是进程,什么是线程?之间的关系?

进程是表示资源分配的基本单位,又是调度运行的基本单位。

线程是进程中执行运算的最小单位,即执行处理机调度的基本单位。

关系:

  1. 创建进程会分配相应的内存空间,创建线程不会分配内存空间。
  2. 一个进程可以包括多个线程,一个线程只隶属于一个进程。
  3. 进程之间是相互独立的,一个进程的崩溃,不会影响其他进程。
  4. 线程是隶属于进程的,线程在进程中可以共享空间,一个线程的崩溃可能会影响其他线程的正常执行。 

 2.创建线程的方式?(3种)

继承Thread、实现Runnable接口、实现Callable接口。

  1. 定义Thread类的子类,并重写该类的run()方法,该方法的方法体就是线程需要完成的任务,run()方法也称为线程执行体。

创建Thread子类的实例,也就是创建了线程对象

启动线程,即调用线程的start()方法

2.定义Runnable接口的实现类,一样要重写run()方法,这个run()方法和Thread中的run()方法一样是线程的执行体

创建Runnable实现类的实例,并用这个实例作为Thread的target来创建Thread对象,这个Thread对象才是真正的线程对象

第三依然是通过调用线程对象的start()方法来启动线程

3.创建Callable接口的实现类,并实现call()方法,然后创建该实现类的实例(从java8开始可以直接使用Lambda表达式创建Callable对象)。

使用FutureTask类来包装Callable对象,该FutureTask对象封装了Callable对象的call()方法的返回值

使用FutureTask对象作为Thread对象的target创建并启动线程(因为FutureTask实现了Runnable接口)

调用FutureTask对象的get()方法来获得子线程执行结束后的返回值

3.线程的状态

  1. 新生当这个语句执行的时候,线程创建,开辟工作空间,也就是线程进入了新生状态。
  2. 就绪start 方法被调用,进入了就绪队列表示这个线程具有了运行的条件,但是还没有开始运行

线程进入就绪状态的四种分别是:

start()方法调用;

本来处于阻塞状态,后来阻塞解除;

如果运行的时候调用 yield() 方法,避免一个线程占用资源过多,中断一下,会让线程重新进入就绪状态。注意,如果调用 yield() 方法之后,没有其他等待执行的线程,此线程就会马上恢复执行;

JVM 本身将本地线程切换到了其他线程,那么这个线程就进入就绪状态。

 3.运行当CPU选定了一个就绪状态的线程,进行执行,线程真正开始执行线程体的具体代码块,基本是 run() 方法。

 4.阻塞阻塞状态指的是代码不继续执行,而在等待,阻塞解除后,重新进入就绪状态。

阻塞的方法有四种:

sleep()方法,是占用资源在睡觉的,可以限制等待多久;

wait() 方法,和 sleep() 的不同之处在于,是不占用资源的,限制等待多久;

join() 方法,加入、合并或者是插队,这个方法阻塞线程到另一个线程完成以后再继续执行;

有些 IO 阻塞,比如 write() 或者 read() ,因为IO方法是通过操作系统调用的。

5.死亡:线程体的代码执行完毕或者中断执行。一旦进入死亡状态,不能再调用 start() 。让线程进入死亡状态的方法是 stop() 和 destroy() 但是都不推荐使用,jdk里也写了已过时。一般的做法是,在线程内,让线程自身自然死亡,或者加一些代码,想办法让线程执行完毕

4线程的状态转换

 

 

5.线程常用的方法?

(1)setName:设置线程名称,使之与参数name相同;

(2)getName:返回该线程的名称;

(3)start:使该线程开始执行,Java虚拟机底层调用该线程的start0( )方法;

(4)run:调用线程对象run方法。start底层会创建新的线程,run是一个简单的方法调用,不会启动新线程。

(5)setPriority:更改线程的优先级;

(6)getPriority:获取线程的优先级;

(7)sleep:在指定的毫秒数内让当前正在执行的线程休眠;

(8)interrupt:中断线程,但并没有真正结束线程,所以一般用于中断正在休眠线程。

(9)yield:线程的礼让。

(10)join:线程的插队。

6.什么是死锁?

所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。

7.死锁的四个必要条件

(1)互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。

(2)请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。

(3)不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。

(4)环路等待条件:在发生死锁时,必然存在一个进程–资源的环形链。

8.预防死锁

资源一次性分配:一次性分配所有资源,这样就不会再有请求了:(破坏请求条件)

只要有一个资源得不到分配,也不给这个进程分配其他的资源:(破坏请保持条件)

可剥夺资源:即当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源(破坏不可剥夺条件)

资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值