zoukankan      html  css  js  c++  java
  • JUC学习--利用synchronized和Lock实现生产者消费者、利用Lock相关知识唤醒指定线程

    实现生产者与消费者模型还可以利用阻塞队列来实现,本文就不赘述了。
    利用sychronized实现生产者与消费者模型
    package com.example.demo;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    /**
     * @author : lijie
     * @version V1.0
     * @Description: 利用sychronized实现生产者与消费者模型
     * @date Date : 2021年07月29日 23:16
     */
    
    public class Test1 {
    
      public static void main(String[] args) {
        ExecutorService service = Executors.newFixedThreadPool(8);
        Ticket ticket = new Ticket();
        for (int i = 0; i < 4; i++) {
    
          service.submit(() -> {
            while (true) {
              ticket.decrement();
            }
          });
        }
    
        for (int i = 0; i < 4; i++) {
    
          service.submit(() -> {
            while(true) {
              ticket.increment();
            }
          });
        }
    //    new Thread(() -> {
    //      for (int i = 0; i < 40; i++) {
    //        tickct.decrement();
    //      }
    //    }, "consumer").start();
    //
    //    new Thread(() -> {
    //      for (int i = 0; i < 40; i++) {
    //        tickct.increment();
    //      }
    //    }, "producer").start();
    
      }
    
    }
    
    class Ticket {
    
      int num = 0;
    
      public synchronized void decrement() {
        // 抢锁
        while (num == 0) {
          try {
            this.wait();
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
        // 业务
    //    num--;
        System.out.println(Thread.currentThread().getName() + "减少1个,还剩" + (--num));
        // 释放锁
        this.notifyAll();
      }
    
      public synchronized void increment() {
        while (num != 0) {
          try {
            this.wait();
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
    //    num++;
        System.out.println(Thread.currentThread().getName() + "增加1个,还剩" + (++num));
        this.notifyAll();
      }
    }
    利用Lock锁来实现生产者与消费者模型
    package com.example.demo;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    /**
     * @author : lijie
     * @version V1.0
     * @Description: 利用Lock锁来实现生产者与消费者模型
     * @date Date : 2021年08月01日 22:51
     */
    
    public class Test2 {
    
      private static ExecutorService threadPool = Executors.newFixedThreadPool(4);
      private static Ticket2 ticket2 = new Ticket2();
    
      public static void main(String[] args) {
        for (int i = 0; i < 2; i++) {
          threadPool.submit(() -> {
            while (true) {
              ticket2.increment();
            }
          });
        }
    
        for (int i = 0; i < 2; i++) {
          threadPool.submit(() -> {
            while (true) {
              ticket2.decremrnt();
            }
          });
        }
      }
    
    }
    
    class Ticket2 {
    
      Lock lock = new ReentrantLock();
      Condition condition = lock.newCondition();
      int num = 0;
    
      public void increment() {
        lock.lock();
        try {
          while (num != 0) {
            condition.await();
          }
          num++;
          System.out.println(Thread.currentThread().getName() + "增加了1,还有" + num);
          condition.signalAll();
        } catch (InterruptedException e) {
          e.printStackTrace();
        } finally {
          lock.unlock();
        }
      }
    
      public void decremrnt() {
        lock.lock();
        try {
          while (num == 0) {
            condition.await();
          }
          num--;
          System.out.println(Thread.currentThread().getName() + "减少了1,还有" + num);
          condition.signalAll();
        } catch (InterruptedException e) {
          e.printStackTrace();
        } finally {
          lock.unlock();
        }
      }
    }
    执行唤醒线程:让线程按照某种规则执行
    package com.example.demo;
    
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    /**
     * @author : lijie
     * @version V1.0
     * @Description: 执行唤醒线程:让线程按照某种规则执行
     * @date Date : 2021年08月01日 23:35
     */
    
    public class Test3 {
    
      public static void main(String[] args) {
        Hello hello = new Hello();
        new Thread(() -> {
          while (true) {
            hello.sayA();
          }
        }, "AA").start();
        new Thread(() -> {
          while (true) {
            hello.sayB();
          }
        }, "BB").start();
        new Thread(() -> {
          while (true) {
            hello.sayC();
          }
        }, "CC").start();
      }
    }
    
    class Hello {
    
      private Lock lock = new ReentrantLock();
      Condition conditionA = lock.newCondition();
      Condition conditionB = lock.newCondition();
      Condition conditionC = lock.newCondition();
      int num = 1;
    
      public void sayA() {
        try {
          lock.lock();
          while (num != 1) {
            conditionA.await();
          }
          System.out.println(Thread.currentThread().getName() + "--AA");
          num = 2;
          conditionB.signal();
        } catch (InterruptedException e) {
          e.printStackTrace();
        } finally {
          lock.unlock();
        }
      }
    
      public void sayB() {
        lock.lock();
        try {
          while (num != 2) {
            conditionB.await();
          }
          System.out.println(Thread.currentThread().getName() + "--BB");
          num = 3;
          conditionC.signal();
    
        } catch (InterruptedException e) {
          e.printStackTrace();
        } finally {
          lock.unlock();
        }
      }
    
      public void sayC() {
        lock.lock();
        try {
          while (num != 3) {
            conditionC.await();
          }
          System.out.println(Thread.currentThread().getName() + "--CC");
          num = 1;
          conditionA.signal();
        } catch (InterruptedException e) {
          e.printStackTrace();
        } finally {
          lock.unlock();
        }
      }
    }
  • 相关阅读:
    [置顶] Blender 三维绘图及渲染软件 (开源优秀强大跨平台)
    观察力训练(福尔摩斯演绎法)
    Shiro 权限框架使用总结
    [置顶] 如何编写出优美的 JavaScript 代码
    TopCoder 入门教程 sqybi完善版
    开源 3D CAD 软件 gCAD3D 1.9.1 发布
    Java 局部内部类访问局部变量必须加 final 关键字
    [置顶] 程序员如何做出“不难看”的设计
    JavaFX DirectoryChooser[目录选择器]使用实例及源代码[图文]
    项目管理软件收集
  • 原文地址:https://www.cnblogs.com/codehero/p/15088140.html
Copyright © 2011-2022 走看看