线程的概念
进程资源分配的最小单位,线程cpu调度的最小单位,可以提高代码运行效率。
线程创建方式
线程创建一共有三种方式
- 继承Thread
继承Thread
类,重写run()
方法,通过start()
开启线程。 - 实现Runnable接口
重写run()方法,通过new Thread(new 实现接口的实现类).start()开启线程。 - 实现callable
重写call接口
三者之间的优缺点
继承Thread类:操作简单,但是已经继承了一个类,不便于扩展。
实现Runnable接口:可以再继承其他方法,还能实现其他接口。易于扩展,操作方便。
实现callable:可以抛出异常,也可以有返回值。对于线程安全要求高的,可以使用。但是操作不便。
线程的状态
线程的五种状态
- 新生状态
- 就绪状态
- 运行状态
- 阻塞状态
- 执行完毕
线程的优先级
线程优先级1-10级(1最小,10最大)。Thread类里面提供了三个静态常量表示优先级。
static int MAX_PRIORITY 、线程可以具有的最高优先级。
static int MIN_PRIORITY 、线程可以具有的最低优先级。
static int NORM_PRIORITY
void setPriority(int newPriority) 更改线程的优先级
int getPriority() 返回线程的优先级。
锁(synchronized)
锁分为两种:锁方法,或者锁代码块。
public synchronized void test(){
}
synchronized (锁代码块要锁住不变的,比如锁this,类.class,或者自定义引用数据类型){
代码;
}
生产者、消费者问题
线程通信涉及到生产者消费者问题。
消费者消费完产品,唤醒生产者notify(),自身处于等待状态wait()。
生产者生产完产品唤醒消费者notify(),自身处于等待状态wait()。