鹿鼎记 · 韦小宝,结合电视剧情讲解java多线程(2)

上一篇 / 下一篇  2022-11-29 11:53:02

  送你一套免费的性能测试框架搭建的课程!省下的300块,去吃一顿热气腾腾的火锅吧!点击下方链接,答问卷,领课程~链接:http://vote.51testing.com/

  4. 皇上、建宁,比武
  public class ReentrantReadWriteLockTest {
      private static final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
      private static final Lock readLock = readWriteLock.readLock();
      private static final Lock writeLock = readWriteLock.writeLock();
      private static Deque<String> deque = new ArrayDeque<>();
      public static String get() {
          readLock.lock();
          try {
              return deque.poll();
          } finally {
              readLock.unlock();
          }
      }
      public static void put(String value) {
          writeLock.lock();
          try {
              deque.add(value);
          } finally {
              writeLock.unlock();
          }
      }
      public static void main(String[] args) {
          new Thread(() -> {
              while (true) {
                  put("小擒拿");
                  put("抓乃龙抓手");
                  put("下脚绊");
                  put("大别子");
                  put("锁喉");
                  put("扣眼珠子");
                  try {
                      Thread.sleep(3000);
                  } catch (InterruptedException ignore) {
                  }
              }
          }).start();
          new Thread(() -> {
              while (true) {
                  System.out.println("韦小宝与皇上比武出招:" + get());
                  try {
                      Thread.sleep(500);
                  } catch (InterruptedException ignore) {
                  }
              }
          }).start();
      }
  }
  场景:在海大富的帮助下蒙混进宫偷四十二章经时,不小心被建宁公主发现,为此引来这样一段打斗比武的场景。小宝不会武功,每天学会点再比试点,因此我们这里使用读写锁来模拟。写锁相当于传授知识、读锁相当于使用知识
  知识:ReentrantReadWriteLock关于读写锁的使用。
  测试结果:
  韦小宝与皇上比武出招:小擒拿
  韦小宝与皇上比武出招:抓乃龙抓手
  韦小宝与皇上比武出招:下脚绊
  韦小宝与皇上比武出招:大别子
  韦小宝与皇上比武出招:锁喉
  韦小宝与皇上比武出招:扣眼珠子
  韦小宝与皇上比武出招:小擒拿
  韦小宝与皇上比武出招:抓乃龙抓手
  韦小宝与皇上比武出招:下脚绊
  韦小宝与皇上比武出招:大别子
  韦小宝与皇上比武出招:锁喉
  韦小宝与皇上比武出招:扣眼珠子
  韦小宝与皇上比武出招:小擒拿
  韦小宝与皇上比武出招:抓乃龙抓手
  韦小宝与皇上比武出招:下脚绊
  韦小宝与皇上比武出招:大别子
  韦小宝与皇上比武出招:锁喉
  5. 七个老婆,隐居
  public class SemaphoreTest {
      public static void main(String[] args){
          List<String> list = new ArrayList<>();
          list.add("韦小宝");
          list.add("阿珂");
          list.add("双儿");
          list.add("曾柔");
          list.add("建宁公主");
          list.add("沐建屏");
          list.add("方怡");
          list.add("苏荃");
          Semaphore semaphore = new Semaphore(4, true);
          for (int i = 0; i < 8; i++) {
              new Thread(() -> {
                  try {
                      semaphore.acquire();
                      String user = list.remove(new Random().nextInt(list.size()));
                      System.out.println("韦小宝带着七个老婆,过着桃园生活。每天打打麻将、练练武术。麻将四人桌:" + user);
                      Thread.sleep(3000L);
                  } catch (InterruptedException ignore) {
                  } finally {
                      semaphore.release();
                  }
              }).start();
          }
      }
  }
  场景:经历了风风雨雨的小宝,最后决定和老婆们过起快乐的隐居生活。我们这里模拟隐居桃园后,每天打打麻将、练练武术,凑够一桌四人。这里我们使用信号量锁 Semaphore,一次凑够四个人就够一桌麻将的人。随机抽取四个人
  知识:Semaphore信号量锁的使用
  测试结果:
  韦小宝带着七个老婆,过着桃园生活。每天打打麻将、练练武术。麻将四人桌:曾柔
  韦小宝带着七个老婆,过着桃园生活。每天打打麻将、练练武术。麻将四人桌:苏荃
  韦小宝带着七个老婆,过着桃园生活。每天打打麻将、练练武术。麻将四人桌:双儿
  韦小宝带着七个老婆,过着桃园生活。每天打打麻将、练练武术。麻将四人桌:阿珂
  韦小宝带着七个老婆,过着桃园生活。每天打打麻将、练练武术。麻将四人桌:方怡
  韦小宝带着七个老婆,过着桃园生活。每天打打麻将、练练武术。麻将四人桌:韦小宝
  韦小宝带着七个老婆,过着桃园生活。每天打打麻将、练练武术。麻将四人桌:建宁公主
  韦小宝带着七个老婆,过着桃园生活。每天打打麻将、练练武术。麻将四人桌:沐建屏
  三、总结
  在鹿鼎记的场景中我们串进去了各个多线程的使用案例,分别包括不同锁:Synchronized、CountDownLatch、ReentrantLock、ReentrantReadWriteLock、Semaphore。
  很多时候如果在学习的过程中,如果能找到一些非常适合的例子,那么对于知识点的学习是非常快的也能有深刻的印象。
  好嘞,这个案例就写完了,感谢支持。同时,这里面的各个场景中的多线程和锁也可以有不同的方式的使用来实现每个场景的效果,可以自行尝试。

TAG: 软件开发 Java java

 

评分:0

我来说两句

Open Toolbar