java并发控制四种方法:
1.wait()/notify();
2. await() / signal() ;
3.BlockingQueue 阻塞队列方法;
4.PipedInputStream / PipedOutputStream
最常用的是wait()/notify(),简单demo见代码:
仓库类:
import java.util.LinkedList; public class Storage { public static final int MAX_SIZE = 100; private LinkedList
生产者类:
public class Producer implements Runnable { private int num; private Storage storage; public Producer(Storage storage){ this.storage = storage; } @Override public void run() { this.produce(); } public void produce(){ this.storage.produce(this.num); } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public Storage getStorage() { return storage; } public void setStorage(Storage storage) { this.storage = storage; } }
消费者类:
public class Consumer implements Runnable { private int num; private Storage storage; public Consumer(Storage storage){ this.storage = storage; } @Override public void run() { this.consume(); } private void consume(){ this.storage.consume(this.num); } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public Storage getStorage() { return storage; } public void setStorage(Storage storage) { this.storage = storage; } }
测试方法类:
public class SysTest { public static void main(String[] args) { Storage storage = new Storage(); Producer pt1 = new Producer(storage); pt1.setNum(10); Producer pt2 = new Producer(storage); pt2.setNum(10); Producer pt3 = new Producer(storage); pt3.setNum(10); Producer pt4 = new Producer(storage); pt4.setNum(10); Producer pt5 = new Producer(storage); pt5.setNum(10); Producer pt6 = new Producer(storage); pt6.setNum(10); Producer pt7 = new Producer(storage); pt7.setNum(80); Thread p1 = new Thread(pt1); Thread p2 = new Thread(pt2); Thread p3 = new Thread(pt3); Thread p4 = new Thread(pt4); Thread p5 = new Thread(pt5); Thread p6 = new Thread(pt6); Thread p7 = new Thread(pt7); Consumer ct1 = new Consumer(storage); ct1.setNum(50); Consumer ct2 = new Consumer(storage); ct2.setNum(20); Consumer ct3 = new Consumer(storage); ct3.setNum(30); Thread c1 = new Thread(ct1); Thread c2 = new Thread(ct2); Thread c3 = new Thread(ct3); c1.start(); c2.start(); c3.start(); p1.start(); p2.start(); p3.start(); p4.start(); p5.start(); p6.start(); p7.start(); } }
结果:
要消费的产品数量:50库存量:0暂时不能执行消费任务!
要消费的产品数量:30库存量:0暂时不能执行消费任务!
已经生产产品数:10现库存量为:10
要消费的产品数量:30库存量:10暂时不能执行消费任务!
要消费的产品数量:20库存量:10暂时不能执行消费任务!
要消费的产品数量:50库存量:10暂时不能执行消费任务!
已经生产产品数:10现库存量为:20
已经生产产品数:10现库存量为:30
已经生产产品数:10现库存量为:40
要消费的产品数量:50库存量:40暂时不能执行消费任务!
已经消费产品数:20现库存量为:20
要消费的产品数量:30库存量:20暂时不能执行消费任务!
已经生产产品数:10现库存量为:30
要消费的产品数量:50库存量:30暂时不能执行消费任务!
要生产的产品数量:80库存量30暂不能执行生产任务
已经消费产品数:30现库存量为:0
已经生产产品数:10现库存量为:10
已经生产产品数:80现库存量为:90
已经消费产品数:50现库存量为:40