Thread
程序 可以理解为静态代码
进程 正在进行的程序 静态的代码 运行起来
线程 正在执行程序中的小单元
1.主线程 系统线程
2.用户线程 main
3.守护线程 gc(跟随系统线程)
线程------------操作系统级别 cpu
如何在java中创建线程 让线程执行 多线程
线程的状态
ne start( cpu分配run() wait() exception/over
创建线程---就绪状态--执行状----等待/挂起-------异常/消亡
| |
| |
|_______________________________|
notify(唤醒)/notifyAll(唤醒所有)
实现线程的过程
方法一:(存在问题:单继承,子类继承父类时,无法再继承线程)
1.自己描述一个类
2.继承父类的Thread
3.重写run方法
4.new一个线程队形 调用start() 让线程进入就绪状态
方法二:
1.自己描述一个类
2.实现一个父接口Runnable
3.重写run方法
4.new一个线程队形 需要创建Thread将自己的对象包起来 然后调用start()
特征修饰符
synchronized(线程安全锁) 同步 一个时间点只有一个线程访问
1.将synchronized关键字放在方法的结构上
public synchronized void test(){} 锁定的是调用方法时的对象
2.将synchronized关键字放在方法(构造方法 块)的内部
public void get(){
代码1
synchronized(对象){//除了能锁定当前对象(this),也可以锁定其他对象
代码2
}
代码3
}
线程状态的切换
执行 等待 执行 等待
Object类中的方法:
wait() 对象.wait()--访问当前对象的线程进入wait状态
notify()/notifyAll()
Thread中的方法
sleep()
run()
start()
所有线程都进入wait状态的话,会产生假死状态:没有线程做事
不加锁可能出现的异常:
ArrayIndexOutOfBounsException:-1:数组越界
IllegalMonitorStateException:让其等待的线程对象不是当前线程的所有者 (访问仓库的线程等待,告知生产者的这一刹那,对象变成了另一个线程)
完善生产者消费模型
1.利用线程安全锁 特征修饰符(同步锁) synchronized
两种不同的写法
不管怎样写 锁定的永远是对象
2.利用方法控制线程状态的来回切换
wait
notify notifyAll
3.Thread类中的方法
sleep() 静态方法(毫秒值)
setPrioity(10) getPriority()------设置/获取线程的优先级 1-10
sleep()与wait()的区别
sleep() wait()
1.类 Thread类 Object类
2.调用 静态 类名. 对象.
3.理解 哪个线程调用 访问该对象的线程进入等待
哪个线程等待 状态
4.唤醒 不需要别人 需要其他对象调用notify唤醒
5.锁 不会释放锁 等待后会释放锁
join()--Thread中的方法
让多个线程并行变成单个线程
testjoin模型:
设计模型的时候,two线程在one的run里面创建 两个有先后顺序
模型执行顺序:
one 启动
two 启动
three 启动
two.join()
2000之后, one想要把two从自己线程内剔除
two对象不在自己手里 被three锁定 10000
one只能等待three将two对象释放后 才能踢掉
synchronized锁,一旦对象被锁定,其他的对象都需要等待
有可能会产生一个死锁的效果
6.死锁
模拟一个模型 演示死锁(哲学家就餐问题)
四个线程同时并发去抢夺相同的资源
解决死锁问题:
1.礼让---产生时间差
2.不要产生对象公用的问题
计时器/定时器----->线程应用
java.util包
Timer类
无参数构造方法 创建对象
timer.schedule()