一、两个线程一个生产者一个消费者
需求情景
两个线程,一个负责生产,一个负责消费,生产者生产一个,消费者消费一个。
涉及问题
同步问题:如何保证同一资源被多个线程并发访问时的完整性。常用的同步方法是采用标记或加锁机制。
wait() / nofity() 方法是基类Object的两个方法,也就意味着所有Java类都会拥有这两个方法,这样,我们就可以为任何对象实现同步机制。
wait()方法:当缓冲区已满/空时,生产者/消费者线程停止自己的执行,放弃锁,使自己处于等待状态,让其他线程执行。
notify()方法:当生产者/消费者向缓冲区放入/取出一个产品时,向其他等待的线程发出可执行的通知,同时放弃锁,使自己处于等待状态。
代码实现(共三个类和一个main方法的测试类)
Resource.java
packagecom.demo.ProducerConsumer;/*** 资源
*@authorlixiaoxi
**/
public classResource {/*资源序号*/
private int number = 0;/*资源标记*/
private boolean flag = false;/*** 生产资源*/
public synchronized voidcreate() {if (flag) {//先判断标记是否已经生产了,如果已经生产,等待消费;
try{
wait();//让生产线程等待
} catch(InterruptedException e) {
e.printStackTrace();
}
}
number++;//生产一个
System.out.println(Thread.currentThread().getName() + "生产者------------" +number);
flag= true;//将资源标记为已经生产
notify();//唤醒在等待操作资源的线程(队列)
}/*** 消费资源*/
public synchronized voiddestroy() {if (!flag) {try{
wait();
}catch(InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+ "消费者****" +number);
flag= false;
notify();
}
}
Producer.java
packagecom.demo.ProducerConsumer;/*** 生产者
*@authorlixiaoxi
**/
public class Producer implementsRunnable{privateResource resource;publicProducer(Resource resource) {this.resource =resource;
}
@Overridepublic voidrun() {while (true) {try{
Thread.sleep(10);
}catch(InterruptedException e) {
e.printStackTrace();
}
resource.create();
}
}
}
Consumer.java
packagecom.demo.ProducerConsumer;/*** 消费者
*@authorlixiaoxi
**/
public class Consumer implementsRunnable{privateResource resource;publicConsumer(Resource resource) {this.resource =resource;
}
@Overridepublic voidrun() {while (true) {try{
Thread.sleep(10);
}catch(InterruptedException e) { </