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

上一篇 / 下一篇  2022-11-29 11:28:04

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

  一、前言
  学习路径决定学习效果!
  有时候很多看似复杂的知识,其实并没有多复杂,只不过你找到的那份资料把知识讲复杂了。为什么这么说呢?
  学习知识可以想象成是一个从开头接触到结尾把知识吸纳的过程,在这个过程中会有一些知识路径行走经历。那么不同的资料就是带着你在走这条知识路径,只不过有些资料容易绕路或者难走(路也跟车有关系,有些路适合客车、有些路适合轿车)。而当你找到一份非常不错并且适合自己的资料时,就会有一种酣畅、通透的感觉,不会感觉学起来多复杂,同时不仅学会了也理解了核心本质。这份资料在你手里就是,车速有点快、系好安全带
  所以,能找到最好的资料也是学习过程中,非常重要的一个点。你的检索能力越强,你就会越容易找到最合适你的资料。
  接下来小傅哥就带你进入鹿鼎记 · 韦小宝的多线程和锁的故事路线,感受逗B的学习路线!
  二、韦小宝与多线程
  小傅哥选取了五个鹿鼎记场景,融入进去不同的多线程使用,包括:丽春院,说书、天地会,香主、招收杂役,入宫、皇上、建宁,比武、七个老婆,隐居,这样五个场景。相信你看完后,一定会记住每个线程的使用!
  1. 丽春院,说书
  public class SynchronizedTest {
      private static ExecutorService 丽春院 = Executors.newFixedThreadPool(10);
      private static volatile boolean 老鸨 = false;
      public static class 客官 implements Runnable {
          private String 姓名;
          public 客官(String 姓名) {
              this.姓名 = 姓名;
          }
          @Override
          public void run(){
              try {
                  清倌(姓名);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
          }
      }
      public static synchronized void 清倌(String 姓名) throws InterruptedException {
          while (true){
              System.out.println("韦春花与" + 姓名 + "喝茶、吟诗、做对、聊风月!");
              if (老鸨){
                  System.out.println("老鸨敲门:时间到啦!\r\n");
                  老鸨 = false;
                  break;
              }
              Thread.sleep(1000);
          }
      }
      private static List<String> list = Arrays.asList("鳌大人", "陈近南", "海大富");
      public static void main(String[] args) throws InterruptedException {
          for (int i = 0; i < 3; i++) {
              丽春院.execute(new 客官(list.get(i)));
              Thread.sleep(3000);
              老鸨 = true;
          }
      }
  }
  场景:韦小宝在丽春院打杂说书时,常有一些大佬(鳌大人、陈近南、海大富)前来与清倌吟诗、做对、聊风月。但由于大家都欣赏其中一个叫韦春花的清倌,所以需要排队。
  知识:使用synchronized锁,和volatile可见性,不断的实例化客官加入线程池,等待与清倌聊天。还可以使用wait()、notify()来实现这一效果过程
  测试结果:
  韦春花与鳌大人喝茶、吟诗、做对、聊风月!
  韦春花与鳌大人喝茶、吟诗、做对、聊风月!
  韦春花与鳌大人喝茶、吟诗、做对、聊风月!
  韦春花与鳌大人喝茶、吟诗、做对、聊风月!
  老鸨敲门:时间到啦!
  韦春花与陈近南喝茶、吟诗、做对、聊风月!
  韦春花与陈近南喝茶、吟诗、做对、聊风月!
  韦春花与陈近南喝茶、吟诗、做对、聊风月!
  韦春花与陈近南喝茶、吟诗、做对、聊风月!
  老鸨敲门:时间到啦!
  韦春花与海大富喝茶、吟诗、做对、聊风月!
  韦春花与海大富喝茶、吟诗、做对、聊风月!
  韦春花与海大富喝茶、吟诗、做对、聊风月!
  韦春花与海大富喝茶、吟诗、做对、聊风月!
  老鸨敲门:时间到啦!
  2. 天地会,香主
  public class CountDownLatchTest {
      public static void main(String[] args) throws InterruptedException {
          List<String> list = Arrays.asList("总舵主,陈近南", "莲花堂香主,蔡德忠",
                  "洪顺堂香主,方大洪",
                  "家后堂香主,马超兴",
                  "参太堂香主,胡德帝",
                  "宏化堂香主,李式开",
                  "青木堂香主,韦小宝",
                  "赤火堂香主,古至中",
                  "玄水堂香主,林永超",
                  "黄土堂香主,姚必达");
          CountDownLatch latch = new CountDownLatch(10);
          ExecutorService exec = Executors.newFixedThreadPool(10);
          for (int i = 0; i < 10; i++) {
              int idx = i;
              exec.execute(() -> {
                  try {
                      System.out.println("天地会核心十堂核心成员,高层会议,成员:" + list.get(idx) + " 入场");
                      Thread.sleep(3000);
                  } catch (Exception ignore) {
                  } finally {
                      latch.countDown();
                  }
              });
          }
          latch.await();
          System.out.println("天地会,核心成员到齐。开会讨论谁入宫,偷取四十二章经!「内定韦香主」");
          exec.shutdown();
      }
  }
  场景:韦小宝在丽春院营救陈近南后,加入了天地会还当上了青木堂韦香主,与其他九位香主齐名:洪顺堂、家后堂、参太堂、宏化堂、赤火堂、玄水堂、黄土堂。这也是天地会的核心成员,他们经常定期开会。这不,就开会讨论由谁入宫偷取四十二章经,其实已经内定了韦香主·韦小宝。
  知识:CountDownLatch门栓效果,满足一定人数就开船、摇摆锤、过山车。那么开会的效果也是使用这个锁来实现,满足10个人以后,关门开始。
  测试结果:
  天地会核心十堂核心成员,高层会议,成员:总舵主,陈近南 入场
  天地会核心十堂核心成员,高层会议,成员:莲花堂香主,蔡德忠 入场
  天地会核心十堂核心成员,高层会议,成员:洪顺堂香主,方大洪 入场
  天地会核心十堂核心成员,高层会议,成员:家后堂香主,马超兴 入场
  天地会核心十堂核心成员,高层会议,成员:参太堂香主,胡德帝 入场
  天地会核心十堂核心成员,高层会议,成员:宏化堂香主,李式开 入场
  天地会核心十堂核心成员,高层会议,成员:青木堂香主,韦小宝 入场
  天地会核心十堂核心成员,高层会议,成员:赤火堂香主,古至中 入场
  天地会核心十堂核心成员,高层会议,成员:玄水堂香主,林永超 入场
  天地会核心十堂核心成员,高层会议,成员:黄土堂香主,姚必达 入场
  天地会,核心成员到齐。开会讨论谁入宫,偷取四十二章经!「内定韦香主」
  3. 招收杂役,入宫
  public class ReentrantLockTest {
      private static ReentrantLock lock = new ReentrantLock(true);
      private static List<String> list = Arrays.asList("路人甲", "路人乙", "路人丙", "路人丁", "路人戊", "路人己", "路人庚", "路人壬", "路人癸", "韦小宝");
      public static void main(String[] args) {
          for (int i = 0; i < 10; i++) {
              int idx = i;
              new Thread(() -> {
                  try {
                      招收杂役(list.get(idx));
                  } catch (InterruptedException ignore) {
                  }
              }).start();
              if (idx == 9) {
                  new Thread(() -> {
                      招收太监(list.get(idx));
                  }).start();
              }
          }
      }
      public static void 招收杂役(String name) throws InterruptedException {
          lock.lock();
          try {
              while (true) {
                  System.out.println(name + ",排队等待进宫当杂役...");
                  Thread.sleep(1000);
              }
          } finally {
              lock.unlock();
          }
      }
      public static void 招收太监(String name) {
          System.out.println(name + ",进宫当太监,不用排队!");
      }
  }
  场景:在被坑作为入宫人选好后,小宝来到了招募杂役的地方,一看排队好长。灵机一动跑到了旁边,这边没有人排队呀!就立马冲了进去。我们在案例中采用公平锁排队的方式来体现这一场景。
  知识:ReentrantLock,公平锁排队,在代码中需要显示的开启锁和关闭锁。
  测试结果:
  路人甲,排队等待进宫当杂役...
  韦小宝,进宫当太监,不用排队!
  路人甲,排队等待进宫当杂役...
  路人甲,排队等待进宫当杂役...
  路人甲,排队等待进宫当杂役...
  路人甲,排队等待进宫当杂役...
  路人甲,排队等待进宫当杂役...

TAG: 软件开发 Java java

 

评分:0

我来说两句

Open Toolbar