java生产者消费者初探

来源:互联网 发布:乌克兰航空怎么样 知乎 编辑:程序博客网 时间:2024/05/22 12:10

要求:生产者线程,消费者线程。初始产品数量为1,start两个线程后只有生产者生产后消费者才能消费,且生产者必须等待消费者消费完成后才能继续生产。 

实现:

 1):类设计

(1)产品类:有产品数量属性,信号量属性(两个线程通信,即根据此标示来让生产者线程和消费者线程休眠或者工作),以及两个synchronized方法(用于控制在任何时间只有一个线程操作创建的产品类实例)。

public class productor {private int num;public boolean flag=true;public productor() {num=1;}public int return_val() {return num;}public synchronized void add() {if(!flag){try {wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}else {num++;flag=false;notifyAll();System.out.println("生产+1,当前数目:"+return_val());}}public synchronized void delete() {if(flag){try {wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}else {num--;flag=true;notifyAll();System.out.println("消费减一,当前数目:"+return_val());}}}
(2)生产者线程类:继承runable借口,实例化时需要传入目标产品类实例。

import java.lang.System;public class produceor implements Runnable {productor productor;public produceor(productor p){this.productor=p;}@Overridepublic void run() {while (true) {productor.add();}}}
(3)消费者线程类:继承runable接口,实例化时需要传入目标产品类实例

public class consumer implements Runnable {private productor productor;public consumer(productor p) {// TODO Auto-generated constructor stubthis.productor=p;}@Overridepublic void run() {// TODO Auto-generated method stubwhile (true) {productor.delete();}}}
2)测试及结果

测试方法:

public class test_consumer {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubproductor p=new productor();produceor p1=new produceor(p);consumer c1=new consumer(p);Thread t1=new Thread(p1);Thread t2=new Thread(c1);t2.start();t1.start();}}

    



0 0
原创粉丝点击