【JavaEE多线程】深入解析Java并发工具类与应用实践

慈云数据 7个月前 (04-27) 技术支持 39 0

目录

    • JUC(java.util.concurrent)的常见类
      • Callable 接口
      • ReentrantLock
      • 原子类
      • 线程池
        • ExecutorService 和 Executors
        • ThreadPoolExecutor
        • 信号量 Semaphore
        • CountDownLatch
        • 集合类
          • 多线程环境使用 ArrayList
          • 多线程环境使用队列
          • 多线程环境使用哈希表

            JUC(java.util.concurrent)的常见类

            concurrent:并发(多线程)

            【JavaEE多线程】深入解析Java并发工具类与应用实践
            (图片来源网络,侵删)

            Callable 接口

            Callable 是一个 interface。也是一种创建多线程的方式,相当于把线程封装了一个 “返回值”。方便程序员借助多线程的方式计算结果

            Runnable能表示一个任务(run方法),返回void

            【JavaEE多线程】深入解析Java并发工具类与应用实践
            (图片来源网络,侵删)

            Callable也能表示一个任务(call方法),返回一个具体的值,类型可以通过泛型参数来指定(Object)

            如果进行多线程操作,如果你关心多线程执行的过程,使用Runnable,比如线程池,定时器,就是用的Runnable只关心过程

            如果进行多线程操作,如果你关心多线程的计算结果,使用Callable,比如通过多线程的方式计算一个公式,计算1+2+…+1000

            代码示例: 创建线程计算 1 + 2 + 3 + … + 1000

            不使用 Callable 版本

            • 创建一个类 Result , 包含一个 sum 表示最终结果, lock 表示线程同步使用的锁对象.
            • main 方法中先创建 Result 实例, 然后创建一个线程 t. 在线程内部计算 1 + 2 + 3 + … + 1000.
            • 主线程同时使用 wait 等待线程 t 计算结束. (注意, 如果执行到 wait 之前, 线程 t 已经计算完了, 就不必等待了).
            • 当线程 t 计算完毕后, 通过 notify 唤醒主线程, 主线程再打印结果.
              static class Result {
                  public int sum = 0;
                  public Object lock = new Object();
              }
              public static void main(String[] args) throws InterruptedException {
                  Result result = new Result();
                  Thread t = new Thread() {
                      @Override
                      public void run() {
                          int sum = 0;
                          for (int i = 1; i 
                              sum += i;
                         }
                          synchronized (result.lock) {
                              result.sum = sum;
                              result.lock.notify();
                         }
                     }
                 };
                  t.start();
                  synchronized (result.lock) {
                      while (result.sum == 0) {
                          result.lock.wait();
                     }
                      System.out.println(result.sum);
                 }
              }
              
                  @Override
                  public Integer call() throws Exception {
                      int sum = 0;
                      for (int i = 1; i 
                          sum += i;
                     }
                      return sum;
                 }
              };
              FutureTask
                  @Override
                  public void run() {
                      System.out.println("hello");
                 }
              });
              
              
              
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon