JUC并发编程(二)

JUC版的生产者和消费者问题

通过Lockz找到Condition

package com.xizi.pc;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class B {
    public static void main(String[] args) {
        Data data = new Data();
        new Thread(()->{
            for (int i = 0; i < 10; i++) {
                try {
                    data.increment();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"A").start();

        new Thread(()->{
            for (int i = 0; i < 10; i++) {
                try {
                    data.decrement();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"B").start();
        new Thread(()->{
            for (int i = 0; i < 10; i++) {
                try {
                    data.increment();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"C").start();
        new Thread(()->{
            for (int i = 0; i < 10; i++) {
                try {
                    data.decrement();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"D").start();

    }

}

class Data2{
    private  int number=0;

    Lock lock1=new ReentrantLock();
    Condition condition=lock1.newCondition();


    public  void increment() throws InterruptedException {
            lock1.lock();
        try {
            while (number!=0){
                // 如果不等于0  等待
                condition.await();
            }
            //等于0 +1
            number++;
            System.out.println(Thread.currentThread().getName()+"=>"+number);
            //通知其他线程 我+1完毕了
            condition.signalAll();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            lock1.unlock();
        }
    }
    public  void decrement() throws InterruptedException {
        lock1.lock();
        try {
            while (number==0){
                // 如果等于0  等待
                condition.await();
            }
            //不等于0 -1
            number--;
            System.out.println(Thread.currentThread().getName()+"=>"+number);
            //通知其他线程 我+1完毕了
            condition.signalAll();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            lock1.unlock();
        }
    }
}

任何一个新的技术,绝对不是仅仅只是覆盖了原来的技术,优势和补充

Condition 精准的通知和唤醒线程

有序执行 A B C D

package com.xizi.pc;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class C {
    public static void main(String[] args) {
        Data3 data3 = new Data3();
        new Thread(()->{
            for (int i = 0; i < 10; i++) {
                data3.printA();
            }
        },"A").start();
        new Thread(()->{
            for (int i = 0; i < 10; i++) {
                data3.printB();
            }
        },"B").start();
        new Thread(()->{
            for (int i = 0; i < 10; i++) {
                data3.printC();
            }
        },"C").start();
    }
}

class Data3{
    private Lock lock =new ReentrantLock();
   private Condition condition1 =lock.newCondition();
  private   Condition condition2 =lock.newCondition();
   private Condition condition3 =lock.newCondition();
    private  int number=1; //1A 2B 3C

public void printA(){
    lock.lock();
    try {
        //业务 判断 执行 通知
        while (number!=1){
            //等待
            condition1.await();
        }
        System.out.println(Thread.currentThread().getName()+"=>AAAAA");
        //唤醒,唤醒B
        number=2;
        condition2.signal();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        lock.unlock();
    }

}
public void printB(){
    lock.lock();
    try {
        while (number!=2){
            //业务 判断 执行 通知
        condition2.await();
        }
        System.out.println(Thread.currentThread().getName()+"=>BBBBB");
        number=3;
        //唤醒C
        condition3.signal();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        lock.unlock();
    }
}
public void printC(){
    lock.lock();
    try {
        while (number!=3) {
            //业务 判断 执行 通知
            condition3.await();
        }
        System.out.println(Thread.currentThread().getName()+"=>CCCC");
        number=1;
        condition1.signal();

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        lock.unlock();
    }
}






}

 

猜你喜欢

转载自blog.csdn.net/weixin_45480785/article/details/105356319