1.线程同步
1)通讯模型:监视线程通讯模型:同时多个独立线程在运动,其运行时的状态由第三方监控线程全程监控,这就是监视线程通讯模型
2)线程同步:为什么要进行线程同步:多线程存在的问题是,假如同时有多个线程操作一个对象的数据,有可能出现线程对象对自己操作
的数据不同步的情况,也就是说可能会导致运算结果出现错误。
3)线程同步问题的解决方案:使用synchronized关键字来解决,解决的方式是通过锁定对象或者方法来完成线程的同步操作
对方法进行同步锁:
public synchronized void say(){
}
如上格式,此方法就被同步锁了,当一个线程操作此方法时,其他的线程则不能操作此方法,只有等当前线程操作完此方法,其他线程
才能对此方法进行操作
对对象进行同步锁:
public void run() {
synchronized(list){
while(true){
if(list.size()==0){
Phone phone = new Phone();
list.add(phone);
System.out.println("生产者生产了一部手机,型号为:phone"+type);
list.notify();
type++;
}else{
try {
list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
当一个线程对当前对象进行操作时,其他线程则不能同时操作
2.生产者消费者模型实现
1)模型的概念:生产线程和消费线程共同操作一个集合,生产者放入对象,消费者取出对象,当集合中没有对象时,生产线程马上回放入一个
对象,而当集合中又对象时,消费者马上会取出一个对象
2) 在java中,每个对象都有从Object父类继承而来的两个关于线程间通讯的方法wait()和notify(),如其方法名所示,一个是等待,一个是通知,当在一个对象上调用wait()方法时,当前线程就会进行wait状态,直到收到另一个对象的notify()发出通知,才会执行下一步计算,在多线程通讯中,经常会用对象的这两个方法,一个典型的案例就是“生产/消费者模型”。
3)注意:wait和notify必须在同步锁之内使用
同步锁锁定对象和wait、notify对象必须同一个
同步锁锁定对象和wait、notify对象必须同一个
当对象wait挂起状态时候是会释放同步锁的
3.线程的生命周期
1)当线程调用start()方法时,线程处于就绪状态,并尝试着来获取CPU的权限,当获得了CPU的权限后就开始运行。
2)当运行时调用sleep(),join(),方法时,线程就会睡眠,时间是方法里面的参数决定,当睡眠时间到了时,便重新回到就绪状态
3)当在运行时调用wait()方法,线程会进入等待状态,当另一个与当前线程进行的通信的线程调用了notify()方法,通知了还在
等待的线程后,这个等待的线程就会开始运行
4)当使用了同步锁,其他线程将会被阻塞,只有当前线程执行完后,其他线程才会运行
5)当线程的run方法执行完毕后,线程死亡