生产者消费者问题
wait-notify解决方法:
Buffer方法:对应的是进程的拿出和放入
import java.util.LinkedList; import static java.lang.Thread.sleep; public class Buffer { private final int MAX = 10; private LinkedList<Object> list = new LinkedList<>(); /** * @param value 生产产品的名字,是什么玩意 * @param time 生产者生产花费的时间 */ public void product(int value, int time){ synchronized (list){ while(list.size() == MAX){ System.out.println("仓库中已经放满"+MAX+"个仓品,达到上限,无法继续放入"); try { wait(); } catch (Exception e) { e.printStackTrace(); } } list.add(value); try { sleep(time*1000); } catch (Exception e) { e.printStackTrace(); } finally { System.out.println("生产者生产花费了"+time+"秒"); } System.out.println("生产者为:"+Thread.currentThread().getName()+"当前仓库容量为"+list.size()); System.out.println("-------------------------------"); list.notifyAll(); } } /** * 相应的对应上面的生产者,基本代码没有任何区别 * @param time */ public void consumer(int time){ synchronized (list){ { while(list.size() == 0){ System.out.println("仓库中已空,请等待生产者生产"); try { wait(); } catch (Exception e) { e.printStackTrace(); } } list.remove(); try { sleep(time*1000); } catch (Exception e) { e.printStackTrace(); } finally { System.out.println("消费者消费花费了"+time+"秒"); } System.out.println("消费者为:"+Thread.currentThread().getName()+"当前仓库容量为"+list.size()); System.out.println("-------------------------------"); list.notifyAll(); } } } }
Producer方法:对应的是product方法的引用
public class Producer implements Runnable{ private Buffer buffer; private String producter; public Producer(Buffer buffer){ this.buffer = buffer; } public String getProducter() { return producter; } public void setProducter(String producter) { this.producter = producter; } @Override public void run() { buffer.product((int)(Math.random()*10),(int)(Math.random()*10)); } }
Comsumer:方法对应的是comsumer方法的引用
public class Consumer implements Runnable{ private Buffer buffer; private String consumer; public Consumer(Buffer buffer){ this.buffer = buffer; } public String getConsumer() { return consumer; } public void setConsumer(String consumer) { this.consumer = consumer; } @Override public void run() { buffer.consumer((int)(Math.random()*10)); } }
Text:测试类
import java.lang.reflect.Field; public class text { public static void main(String[] args) throws ClassNotFoundException { Buffer buffer = new Buffer(); Thread producter1 = new Thread(new Producer(buffer)); Thread producter2 = new Thread(new Producer(buffer)); Thread producter3 = new Thread(new Producer(buffer)); Thread producter4 = new Thread(new Producer(buffer)); Thread comsumer1 = new Thread(new Consumer(buffer)); Thread comsumer2 = new Thread(new Consumer(buffer)); Thread comsumer3 = new Thread(new Consumer(buffer)); Thread comsumer4 = new Thread(new Consumer(buffer)); producter1.start(); producter2.start(); producter3.start(); producter4.start(); comsumer1.start(); comsumer2.start(); comsumer3.start(); comsumer4.start(); // people_Producer p = new people_Producer(); // Class clazz = p.getClass(); // Field[] fields = clazz.getDeclaredFields(); // for (Field field : // fields) { // // } } }