java架构《并发线程高级篇三》

    本章主要介绍和讲解concurrent.util里面的常用的工具类。

一、CountDownLatch使用:(用于阻塞主线程)

      应用场景 :通知线程休眠和运行的工具类,是wait和notify的升级版本。notify不会释放锁,但是  countDown()会释放锁

          实例化:final CountDownLatch countDown = new CountDownLatch(2);

                  使用在Thread里面:   countDownLatch.countDown(); 相当于 notfiy;   countDown()会释放锁
                                                                countDownLatch.await();相当于 wait;

二、CyclicBarrier使用:barrier(障碍) (用于多个阻塞线程等待,都通准备好后,一起开始执行当前线程的代码)

      应用场景:多个线程,当任何一个线程都没准备好,都阻塞。当都准备好时,都执行自己的线程。

      注意事项:多少个线程,需要多少个barrier.await();否则都会阻塞在此。

      代码解析:

          

          public class UseCyclicBarrier {

            static class Runner implements Runnable {
            private CyclicBarrier barrier;
            private String name;

            public Runner(CyclicBarrier barrier, String name) {
              this.barrier = barrier;
              this.name = name;
              }
            @Override
            public void run() {
              try {
                Thread.sleep(1000 * (new Random()).nextInt(5));
                System.out.println(name + " 准备OK.");
                barrier.await();
                } catch (InterruptedException e) {
                  e.printStackTrace();
                } catch (BrokenBarrierException e) {
                  e.printStackTrace();
                }
                System.out.println(name + " Go!!");
                }
              }

        public static void main(String[] args) throws IOException, InterruptedException {
            CyclicBarrier barrier = new CyclicBarrier(3); // 3
            ExecutorService executor = Executors.newFixedThreadPool(3);

            executor.submit(new Thread(new Runner(barrier, "zhangsan")));
            executor.submit(new Thread(new Runner(barrier, "lisi")));
            executor.submit(new Thread(new Runner(barrier, "wangwu")));

            executor.shutdown();
          }

        }

三、Future模式补充和Callable

         使用场景:需要大数量量处理数据的时候,异步去处理数据,提高程序的吞吐量

           注意事项:真正进行业务逻辑处理的类, 类一定实现Callable接口,重写Call()方法。

          private String para;

          public UseFuture(String para){
          this.para = para;
          }

          /**
          * 这里是真实的业务逻辑,其执行可能很慢
          */
          @Override
          public String call() throws Exception {
          //模拟执行耗时
          Thread.sleep(5000);
          String result = this.para + "处理完成";
          return result;
        }

       

        String queryStr = "query";
        //构造FutureTask,并且传入需要真正进行业务逻辑处理的类,该类一定是实现了Callable接口的类
        FutureTask<String> future = new FutureTask<String>(new UseFuture(queryStr));

        FutureTask<String> future2 = new FutureTask<String>(new UseFuture(queryStr));
        //创建一个固定线程的线程池且线程数为1,
        ExecutorService executor = Executors.newFixedThreadPool(2);
        //这里提交任务future,则开启线程执行RealData的call()方法执行
        //submit和execute的区别: 第一点是submit可以传入实现Callable接口的实例对象, 第二点是submit方法有返回值

        Future f1 = executor.submit(future); //单独启动一个线程去执行的
        Future f2 = executor.submit(future2);
        System.out.println("请求完毕");

          try {
            //这里可以做额外的数据操作,也就是主程序执行其他业务逻辑
            System.out.println("处理实际的业务逻辑...");
            Thread.sleep(1000);
          } catch (Exception e) {
              e.printStackTrace();
            }
          //调用获取数据方法,如果call()方法没有执行完成,则依然会进行等待
          System.out.println("数据:" + future.get());
          System.out.println("数据:" + future2.get());

          executor.shutdown();

        

        总结:FutureTask对象。当使用其get()方法时,会异步加载对应的返回结果。Future 对象。当使用其get()方法时。返回null,则表示该子线程已经完成。

           submit和execute的区别: 第一点是submit可以传入实现Callable接口的实例对象, 第二点是submit方法有返回值。

四、Semaphore信号量

        使用场景:当 系统上线之前,对系统进行信息并发量的评估。进行自动化测试。

        相关概念:

             PV(page  view) :网站总访问量,页面浏览量或点击量,每刷新一次都记录下来。

             UV(unique Visitor):访问网站的IP总数,没一个Ip,一天内只记录一次。
             QRS(Query per second):每秒的查询数。

             RT(response time):访问相应时间。

        

               

            

      

时间: 2024-08-29 03:08:30

java架构《并发线程高级篇三》的相关文章

java架构《并发线程高级篇四》

本章主要讲并发线程的常见的两种锁.重入锁和读写锁 一:重入锁(ReentrantLock) 概念:重入锁,在需要进行同步的代码加锁,但最后一定不要忘记释放锁,否则会造成锁永远不能释放,其他线程进不了 代码解析: 实例化:Lock lock = new ReentrantLock(); 锁定:lock .lock(); 释放锁:lock.unlock(); 代码: private Lock lock = new ReentrantLock(); public void method1(){ try

java架构师 - 开发技能篇

00 JDK常见数据结构 https://www.cnblogs.com/lizhuxin/p/10745199.html 01 java中IO.NIO https://www.cnblogs.com/lizhuxin/p/10745212.html 02 java多线程基础 https://www.cnblogs.com/lizhuxin/p/10745216.html 03 java线程安全与通讯 https://www.cnblogs.com/lizhuxin/p/10745229.htm

Java面试题之高级篇研读

1.List和Set比较,各自的子类比较 对比一:ArrayList与LinkedList比较 1.ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里连续存放). 2.因为地址连续,ArrayList执行插入和删除操作效率较低. 3.LinkedList是基于链表的数据结构,地址是任意的,所以在开辟内存空间的时候不需要等一个连续的地址,对于新增和删除操作add和remove,LinkedList比较占优势. 4.因为LinkedLis

线程高级篇-Lock锁和Condition条件

浅谈Synchronized: synchronized是Java的一个关键字,也就是Java语言内置的特性,如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,执行代码块时,其他线程 便只能一直等待,等待获取锁的线程释放锁,而获取锁的线程释放锁会有三种情况: 1).获取锁的线程执行完该代码块,然后线程释放对锁的占有; 2).线程执行发生异常,此时JVM会让线程自动释放锁; 3).调用wait方法,在等待的时候立即释放锁,方便其他的线程使用锁. Lock的特性: 1).Lo

Java 编程之美:并发极速赛车平台出租编程高级篇

借用 Java 并发极速赛车平台出租haozbbs.comQ1446595067 编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了. 相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作的顺序是不可预期的. 并发编程相比 Java 中其他知识点学习起来门槛相对较高,学习起来比较费劲,从而导致很多人望而却步: 而无论是职场面试和高并发高流量的系统的实现却都还离不开并发编程,从而导致能够真正掌握并发编程的人才成为市场比较迫

java架构师、高性能、高并发、高可用、高可扩展、性能优化、集群、电商网站架构

15套java架构师.集群.高可用.高可扩展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布式项目实战视频教程 视频课程内容包含: 高级Java架构师包含:Spring boot.Spring  cloud.Dubbo.Redis.ActiveMQ.Nginx.Mycat.Spring.MongoDB.ZeroMQ.Git.Nosql.Jvm.Mecached.Netty.Nio.Mina.性能调优.高并发.to

java架构师课程、性能调优、高并发、tomcat负载均衡、大型电商项目实战、高可用、高可扩展、数据库架构设计、Solr集群与应用、分布式实战、主从复制、高可用集群、大数据

15套Java架构师详情 * { font-family: "Microsoft YaHei" !important } h1 { background-color: #006; color: #FF0 } 15套java架构师.集群.高可用.高可扩展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布式项目实战视频教程 视频课程包含: 高级Java架构师包含:Spring boot.Spring  clo

java架构师大型分布式综合项目实战、千万高并发

* { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩 展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布 式项目实战视频教程 视频课程包含: 高级Java架构师包含:Spring boot.Spring  cloud.Dubbo.Redis.ActiveMQ.Nginx.Mycat

java架构师负载均衡、高并发、nginx优化、tomcat集群、异步性能优化、Dubbo分布式、Redis持久化、ActiveMQ中间件、Netty互联网、spring大型分布式项目实战视频教程百度网盘

15套Java架构师详情 * { font-family: "Microsoft YaHei" !important } h1 { background-color: #006; color: #FF0 } 15套java架构师.集群.高可用.高可扩展.高性能.高并发.性能优化.Spring boot.Redis.ActiveMQ.Nginx.Mycat.Netty.Jvm大型分布式项目实战视频教程 视频课程包含: 高级Java架构师包含:Spring boot.Spring  clo