一. 基础知识
1. Java语言支持语言级并发
2. 多线程的作用
- 提高UI的响应速度
- 提高硬件资源的利用效率
- 隔离高速硬件和低速硬件
- 提供程序上的抽象来隔离不同的运行模块
二. 线程的生命周期
1. 线程的状态
- 出生态(Born)/新线程(New Thread)
- 就绪态(Ready)/可运行线程(Runnable Thread)
- 运行态(Running)
- 休眠态(Sleeping)
- 等待态(Waiting)
- 阻塞态(Blocked)
- 死亡态(Dead)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rie2Gs7v-1597502871128)(upload\image-20200730231601043.png)]
2. 两个线程的“依赖”关系
- 某个线程只有在另一个线程终止时,才能继续执行,则依赖线程可以调用另一个线程的join()方法,当另一个线程死亡时,依赖线程从等待态转化为就绪态
3. 线程的优先级
- 当Java线程被创建时,该线程从父进程中继承优先级并保持一致
- 线程被创建后,可以改变线程的优先级
- 线程的优先级定义为10级,分别用数字1到10表示
- 最高优先级MAX_PRIORITY对应10级
- 默认优先级NORM_PRIORITY对应5级
- 最低优先级MIN_PRIORITY对应1级
- 调用Thread类的getPriority()方法获取线程的优先级,setPriority()方法更改线程的优先级
三. 线程的创建
1. Thread类
- Thread类是java.lang.Object类的直接子类
成员属性:
MAX_PRIORITY 10
MIN_PRIORITY 1
NORM_PRIORITY 5
构造方法:
public Thread()
public Thread(Runnable target)
public Thread(String name)
public Thread(Runnable target, String name)
public Thread(ThreadGroup group, Runnable target)
public Thread(ThreadGroup group, String name)
public Thread(ThreadGroup group, Runnable target, String name)
public Thread(ThreadGroup group, Runnable target, String name, long stackSize)
成员方法:
interrupt()
join()
join(long millis)
join(long millis, int nanos)
sleep(long millis)
sleep(long millis, int nanos)
start()
yield()
run()
notify()
notifyAll()
wait()
wait(long timeout)
wait(long timeout, int nanos)
isAlive()
isInterrupted()
getPriority()
getId()
getName()
getState()
setPriority(int newPriority)
setName(String name)
2. 创建线程
(1)方法一:继承Thread类
- 具体步骤:
- 扩展Thread的类
- 实现run()方法
- 通过new关键字实例化该类的一个新对象(即一个线程):
new ClassName()
- 通过调用start()方法启动线程
(2)方法二:实现Runnable接口
- java.lang中的接口Runnable,其中只有一个run()方法
- 具体步骤:
- 实现Runnable接口
- 实现run()方法
- 通过new关键字实例化该类的一个新对象(即一个Runnable对象),然后将之用作Thread()构造方法的参数,用来生成新的线程体对象:
new Thread(new ClassName())
- 通过调用start()方法启动线程
四. 线程之间的协作
1. 同步(synchronized)
- 同步方法(语句块)当一个线程执行时自动加锁,直到方法(语句块)运行结束,锁结束
- 设置同步
- 方法同步:
synchronized ReturnType methodName(parameterList) { method statement; }
- 语句块同步:
synchronized(object) { statement; }
2. 使用wait()和notify()/notifyAll()实现多线程的协作
- 线程调用wait()后进入等待态
- 释放监控器的锁,暂停运行
- 时间到,或notify()唤醒后进入就绪态
- 申请到监控器的锁,运行wait()后续代码