本章主要介绍和讲解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):访问相应时间。
原文:http://www.cnblogs.com/coes/p/6862762.html