多线程
生产者与消费者(线程通信)
实现生产者和消费者案例(一)
public class Resource {
//定义布尔类型的成员,标志位,指示线程该做什么
//false没有,需要生产, true需要消费
boolean flag = false;
int count ;//包子的计数器
}
public class Product implements Runnable {
//创建资源对象
Resource r = new Resource();
public void run() {
while(true) {
//对象资源进行操作,判断变量
if(r.flag == true) {
//没有被消费,不能生产,等待
try{
wait();}catch(Exception ex) {
ex.printStackTrace();}
}
//可以生产
r.count++;
System.out.println("生产了第"+r.count+"个");
//修改标志位
r.flag = true;//可以消费
//唤醒消费的线程
notify();
}
}
}
public class Customer implements Runnable{
//创建资源对象
Resource r = new Resource();
public void run() {
while(true) {
//判断标志位
if(r.flag == false) {
//需要生产,不能消费,等待
try{
wait();}catch(Exception ex) {
ex.printStackTrace();}
}
//可以消费
System.out.println("消费了第"+r.count+"个");
//修改标志位,已经消费,可以生产
r.flag = false;
//唤醒生产线程
notify();
}
}
}
以上程序启动线程后,抛出异常 java.lang.IllegalMonitorStateException(运行时期的异常) 异常称为无效的监视器状态异常. 使用了线程的方法,来自于Object类: wait() notify() , 方法必须出现在同步中
解决异常问题,使用同步代码块
实现生产者和消费者案例(二)
添加了同步代码块后,程序居然停止不动了
分析原因 : notify()方法的时候,没有唤醒任何一个线程,导致的生产和消费的两个线程都处于wait()状态
两个方向的线程,使用的锁不是一个
解决办法 : 生产者线程和消费者线程,使用同一个对象锁, wait() notify()方法调用者,必须是锁对象
public class Product implements Runnable {
//创建资源对象
Resource r ;
public Product(Resource r) {
this.r = r;
}
public void run() {
while(true) {
synchronized(r) {
//对象资源进行操作,判断变量
if(r.flag == true) {
//没有被消费,不能生产,等待
try{
r.wait();}catch(Exception ex) {
ex.printStackTrace();}
}
//可以生产
r.count++;
System.out.println("生产了第"+r.count+"个");
//修改标志位
r.flag = true;//可以消费
//唤醒消费的线程
r.notify();
}
}
}
}
public class Customer implements Runnable{
//创建资源对象
Resource r ;
public Customer(Resource r) {
this.r = r;
}
public void run() {
while(true) {
synchronized(r) {
//判断标志位
if