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

04-27 4335阅读 0评论

目录

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

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

            concurrent:并发(多线程)

            Callable 接口

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

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

            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");
                 }
              });
              
              
              

免责声明
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明。
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所
提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何
损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在
转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并白负版权等法律责任。

手机扫描二维码访问

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
评论列表 (暂无评论,4335人围观)

还没有评论,来说两句吧...

目录[+]