1.三个非常重要的概念
程序----> 一组写好了的静态的代码
进程----> 正在进行着的程序 静态的代码执行起来啦
线程----> 是进程内的小单元 很多线程同时执行
2.需要掌握线程的几种不同的状态 及如何切换
new对象 start() CPU分配run() wait() exception
创建线程(对象)----就绪状态----执行状态----等待/挂起----异常/消亡
| |
|__________________________|
notify/notifyAll
3.如何实现线程
自定义一个类
继承Thread 实现Runnable
重写run方法
调用start方法 让线程进入就绪状态 需要注意的是start方法Thread类中
购票的小例子
利用Vector集合 线程安全 多个线程并发操作同一个集合的时候 不会抢夺资源
生产消费者模型
1.通过这个模型 成功的演示出了 线程安全的问题
两个消费者 同时访问同一个仓库对象 仓库内只有一个元素的时候
两个消费者并发访问 会有可能产生抢夺资源的问题
2.自己解决一下线程安全的问题
让仓库对象被线程访问的时候 仓库对象被锁定
仓库对象只能被一个线程访问 其他的线程处于等待状态
特征修饰符
synchronized 同步 一个时间点只有一个线程访问
线程安全锁
两种形式写法
1.将synchronized关键字 放在方法的结构上
public synchronized void get(){}
锁定的是调用方法时的那个对象
2.将synchronized关键字 方在方法(构造方法 块)的内部
public void get(){
好多代码
synchronized(对象){
好多代码
}
好多代码
}
3.我们觉得return不是很好
应该让线程的不同状态来回切换
执行 等待 执行 等待
wait() Object类中的方法
notify notifyAll Object类中的方法
sleep();
run();
start();
==================================================================
比较重要的方法 join---->Thread类
设计一个模型
1.有两个线程 One Two two加入到one里面
2.设计模型时候 two线程在one的run里面创建 保证两个有先后顺序
3.two.join(); 无参数==0 有参数==2000
one 启动
two 启动
three 启动
two就join啦
2000之后 one想要将two从自己的线程内剔除
two对象不在自己的手里 对象被three线程锁定啦 10000
one只能等待 threee将two对象释放后 才能踢掉
synchronized锁 非常的厉害
一旦对象被锁定 不释放的情况下 其他的对象都需要等待
有可能会产生一个死锁的效果