1 lock await signal方式
class ShareData{
private volatile int number = 0;
private int MAX_VALUE = 3;
private int MIN_VALUE = 0;
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
public void increment() {
lock.lock();
try {
while(number >= MAX_VALUE) {
System.out.println("库存已到最大值,无法继续生产");
condition.await();
}
number++;
System.out.println(Thread.currentThread().getName()+"生产一件产品,剩余"+number);
condition.signalAll();
} catch (Exception e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void decrement() {
lock.lock();
try {
while(number <= MIN_VALUE) {
System.out.println("库存为0,无法消费");
condition.await();
}
number--;
System.out.println(Thread.currentThread().getName()+"消费产品,剩余"+number);
condition.signalAll();
} catch (Exception e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
public class ProdConsumerDemo {
public static void main(String[] args) {
ShareData shareData = new ShareData();
for (int i = 0; i < 50; i++) {
new Thread(()->{
for (int j = 0; j < 50; j++) {
shareData.decrement();
}
},"consumer"+String.valueOf(i)).start();
}
for (int j = 0; j < 50; j++) {
new Thread(()->{
for(int i = 0; i < 50; i++) {
shareData.increment();
}
},"productor"+String.valueOf(j)).start();
}
}
}
2阻塞队列方式
class MyResource{
private BlockingQueue<Integer> blockingQueue = null;
private AtomicInteger atomicInteger = new AtomicInteger();
private volatile boolean flag = true;
public MyResource(BlockingQueue<Integer> blockingQueue) {
this.blockingQueue = blockingQueue;
}
public void product() throws InterruptedException {
while(flag) {
boolean res = blockingQueue.offer(atomicInteger.incrementAndGet(), 1L, TimeUnit.SECONDS);
if(res) {
System.out.println("inserting success");
}else {
System.out.println("inserting failed");
}
}
}
public void consume() throws InterruptedException {
while(flag) {
Integer t = blockingQueue.poll(2L, TimeUnit.SECONDS);
if(t == null) {
flag = false;
System.out.println("等待2秒后无法消费,退出");
return;
}else {
System.out.println("consuming success");
}
}
}
public void stop() {
flag = false;
}
}
public class ProdConsumerDemo2 {
public static void main(String[] args) {
MyResource myResource = new MyResource(new ArrayBlockingQueue<>(3));
new Thread(()->{
for (int i = 0; i < 5; i++) {
try {
myResource.product();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
},"productor").start();
new Thread(()->{
for (int i = 0; i < 5; i++) {
try {
myResource.consume();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
},"comsumer").start();
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
myResource.stop();
}
}
3 synchronized wait notify方式
未完待续