生产者消费者
- 使用lock实现生产者消费者模式
public class ProdConsumer_TraditionDemo {
public static void main(String[] args) {
ShareData shareData = new ShareData();
for (int i = 0; i < 5; i++) {
new Thread(() -> {
try {
shareData.increment();
} catch (Exception e) {
e.printStackTrace();
}
}, "AA").start();
}
for (int i = 0; i < 5; i++) {
new Thread(() -> {
try {
shareData.decrement();
} catch (Exception e) {
e.printStackTrace();
}
}, "BB").start();
}
}
}
class ShareData{
private int number = 0;
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
public void increment() throws Exception{
lock.lock();
try {
while (number != 0){
condition.await();
}
number++;
System.out.println(Thread.currentThread().getName()+"\t"+number);
condition.signalAll();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void decrement() throws Exception{
lock.lock();
try {
while (number == 0){
condition.await();
}
number--;
System.out.println(Thread.currentThread().getName()+"\t"+number);
condition.signalAll();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
- 使用阻塞队列+AtomicInteger+volatile实现生产者消费者模式
public class ProdConsumer_BlockQueueDemo {
public static void main(String[] args) {
MyResource resource = new MyResource(new ArrayBlockingQueue<>(10));
new Thread(()->{
try {
System.out.println(Thread.currentThread().getName()+"\t 生产线程启动");
resource.myProd();
} catch (InterruptedException e) {
e.printStackTrace();
}
},"Prod").start();
new Thread(()->{
try {
System.out.println(Thread.currentThread().getName()+"\t 消费线程启动");
resource.myConsumer();
} catch (InterruptedException e) {
e.printStackTrace();
}
},"Consumer").start();
try { TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); }
System.out.println();
System.out.println();
System.out.println();
System.out.println("5秒钟时间到,活动结束");
resource.stop();
}
}
class MyResource{
private volatile boolean FLAG = true;
private AtomicInteger atomicInteger = new AtomicInteger();
BlockingQueue<String> blockingQueue = null;
public MyResource(BlockingQueue<String> blockingQueue) {
this.blockingQueue = blockingQueue;
System.out.println(blockingQueue.getClass().getName());
}
public void myProd() throws InterruptedException {
String data = null;
boolean returnValue;
while (FLAG){
data = atomicInteger.incrementAndGet()+"";
returnValue = blockingQueue.offer(data,2L, TimeUnit.SECONDS);
if(returnValue){
System.out.println(Thread.currentThread().getName()+"\t 插入队列成功"+data+"成功");
}else {
System.out.println(Thread.currentThread().getName()+"\t 插入队列失败"+data+"失败");
}
try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }
}
System.out.println(Thread.currentThread().getName()+"\t FLAG = false,生产动作结束");
}
public void myConsumer() throws InterruptedException {
String result = null;
while (FLAG){
result = blockingQueue.poll(2,TimeUnit.SECONDS);
if(null == result || result.equalsIgnoreCase("")){
System.out.println(Thread.currentThread().getName()+"\t 超过2秒钟,消费退出");
System.out.println();
System.out.println();
return;
}
System.out.println(Thread.currentThread().getName()+"\t 消费队列"+result+"成功");
}
}
public void stop(){
this.FLAG = false;
}
}