java并发控制四种方法:
1.wait()/notify();
2.await()/notify();
3.BlockingQueue 阻塞队列方法;
4.PipedInputStream / PipedOutputStream
最常用的是wait()/notify(),简单demo见代码:
?
?
仓库类:
import java.util.LinkedList;
public class Storage {
public static final int MAX_SIZE = 100;
private LinkedList<Object> list = new LinkedList<Object>();
public void produce(int num) {
synchronized (list) {
while (num + list.size() > Storage.MAX_SIZE) {
System.out.println("要生产的产品数量:" + num + "库存量"
+ list.size() + "暂不能执行生产任务");
try {
list.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for (int i = 0; i < num; i++) {
list.add(new Object());
}
System.out.println("已经生产产品数:" + num + "现库存量为:" + list.size());
list.notifyAll();
}
}
public void consume(int num) {
synchronized (list) {
while (num > list.size()) {
System.out.println("要消费的产品数量:" + num + "库存量:"
+ list.size() + "暂时不能执行消费任务!");
try {
list.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for (int i = 1; i <= num; ++i) {
list.remove();
}
System.out.println("已经消费产品数:" + num + "现库存量为:" + list.size());
list.notifyAll();
}
}
public LinkedList<Object> getList() {
return list;
}
public void setList(LinkedList<Object> list) {
this.list = list;
}
}
?生产者类:
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