CountDownLatch并发测试

CountDownLatch是并发容器JUC下的类,允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。
使用给定的计数初始化CountDownWatch。由于调用了countdown()方法,wait方法将一直阻塞,直到当前计数为零。之后,所有等待线程都被释放,任何随后的wait调用都会立即返回。这是一种一次性现象——计数无法重置。如果您需要重置计数的版本,请考虑使用cyclicBarrier。
CountDownLatch是一种通用的同步工具,可用于多种用途。用一个计数初始化的Countdownloatch用作一个简单的开/关闩锁。或:所有调用的线程都等待在入口等待,直到被调用的线程打开为止。countDown()。一个CountDownLatch初始化为N可以用来做一个线程等待,直到N线程完成一些动作,或某些动作已经完成N次。
Countdownloatch的一个有用属性是,它不要求调用countdown的线程在继续之前等待计数达到零, 它只是防止任何线程在所有线程都可以通过之前继续经过等待。
CountDownLatch 官方API

HttpClientUtil是自己写的一个发送http请求的工具类

public class CountDownLatchTest {

    public static void main(String[] args) {
        final long time = System.currentTimeMillis();
        final String url = "http://localhost/user/";
        int len = 10;
        final CountDownLatch latch = new CountDownLatch(len);
        for (int i = 0; i < len; i++) {
            final int id = i;
            new Thread(new Runnable() {
                public void run() {
                    latch.countDown();
                    try{
                        latch.await();
                    } catch (InterruptedException e){
                        e.printStackTrace();
                    }
                    HttpClientUtil.sendGet(url + id);
                    long usetime = System.currentTimeMillis() - time;
                    System.out.println("到第" + id + "个请求已用时:" + usetime / 1000 + "秒");
                }
            }).start();
        }
    }

}

主要使用两个方法

public void await()

除非线程被中断,否则导致当前线程等待锁存器倒计数到零。, 导致当前线程等待,直到锁存器倒计数至零,除非线程被中断。
如果当前计数为零,则此方法立即返回。
如果当前计数大于零,则当前线程将被禁用以进行线程调度,并且在发生以下两种情况之一之前处于休眠状态:, 如果当前计数大于零,则当前线程的线程调度目的就退出,一直处于休眠状态的两种情况之一发生:
由于countDown()方法的调用,计数达到零;要么
其他一些线程会中断当前线程。
如果当前线程:
在进入此方法时设置其中断状态;要么
在等待时被打断
然后抛出InterruptedException并清除当前线程的中断状态。

public void countDown()

减少锁存器的计数,如果计数达到零则释放所有等待的线程。
如果当前计数大于零,则递减。如果新计数为零,则重新启用所有等待线程以进行线程调度。
如果当前计数等于零,则没有任何反应。

你可能感兴趣的:(CountDownLatch并发测试)