CountDownLatch----线程计数器

news/2024/7/16 9:02:30

问题

最近我在处理一批数据,用多线程来处理,我想知道大概多久能处理完。比如我先用多线程处理 100 条数据,统计下用时,然后根据总的数据量就可以大概估算出处理完这批数据要多久。

使用 CountDownLatch 计时

思路:用两个 CountDownLatch 倒计时锁:开始计时锁,任务结束计时锁。开始计时锁在子线程任务开始时通过 await() 阻塞所有子线程,然后在主线程中通过 CountDownLatch 控制所有子线程同时开始获取开始时间;任务结束计时锁 CountDownLatch 在每个子线程执行完后都 countDown 一次,直到所有子线程执行完,主线程开始记录所有任务执行结束时间。

示例代码

/**
 * ClassName: ThreadTiming <br/>
 * Function: 计算多个线程任务执行完后的用时<br/>
 *
 * @author gary.liu
 * @date 2017/6/24
 */
public class ThreadTiming {

    private int nThread;

    private CountDownLatch startGate;
    private CountDownLatch endGate;

    public ThreadTiming(int nThread, CountDownLatch startGate, CountDownLatch endGate) {

        this.nThread = nThread;
        this.startGate = startGate;
        this.endGate = endGate;
    }

    class worker implements Runnable {

        public void run() {
            try {
                startGate.await();
                Random random = new Random();
                int num = random.nextInt(500) + 500;
                System.out.println(Thread.currentThread().getName() + " start and sleep: " + num + "ms");
                Thread.sleep(num);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
                endGate.countDown();
            }
        }
    }

    public long timeTasks() {

        for(int i = 0; i < nThread; i++){
            Thread thread = new Thread(new worker());
            thread.start();
        }

        long start = System.currentTimeMillis();
        //所有阻塞的任务同时开始
        startGate.countDown();
        try {
            //主线程阻塞,等待其他所有 worker 线程完成后再执行
            endGate.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        long end = System.currentTimeMillis();
        System.out.println("用时: " + (end - start) + "ms");

        return end - start;
    }

    public static void main(String[] args) {

        int nThread = 5;
        CountDownLatch startGate = new CountDownLatch(1);
        CountDownLatch endGate = new CountDownLatch(nThread);

        new ThreadTiming(nThread, startGate, endGate).timeTasks();

    }
}

运行结果

Thread-4 start and sleep: 897ms
Thread-0 start and sleep: 811ms
Thread-2 start and sleep: 678ms
Thread-3 start and sleep: 582ms
Thread-1 start and sleep: 576ms
用时: 903ms

可以看到总用时比花费最长时间的线程任务时间多一点,随着并发量越大,达到可同时并发执行的线程最大数后,用时会越久。

转载于:https://blog.51cto.com/jtech/2165633


http://www.niftyadmin.cn/n/4388904.html

相关文章

PHP多进程初探 --- 开篇

[原文地址&#xff1a;https://blog.ti-node.com/blog...] 实际上PHP是有多线程的&#xff0c;只是很多人不常用。使用PHP的多线程首先需要下载安装一个线程安全版本&#xff08;ZTS版本&#xff09;的PHP&#xff0c;然后再安装pecl的pthread扩展。 实际上PHP是有多进程的&…

c++ 输入一个分数输出最简分式_分式及增长量的大小比较

大小比较。一定要结合选项&#xff01;比如题干问你&#xff0c;某一年哪个月最高&#xff0c;我们不需要从1月算到12月&#xff0c;我们只需要算选项中提到的四个月即可。分式大小比较&#xff1a;分子大分母小的大&#xff0c;分子小分母大的小&#xff1b;分子分母同大同小的…

Tachyon brief intro

作者&#xff1a;刘旭晖 Raymond 转载请注明出处 Email&#xff1a;colorant at 163.com BLOG&#xff1a;http://blog.csdn.net/colorant/ Tachyon是AmpLab的Li Haoyuan所开发的一个基于内存的分布式文件系统&#xff0c;出发点是作为AMPLAB的BDAS的一个组成部分 总体设计思想…

使用Python3开发的一款Android截屏神器

Android设备截屏神器 只需要一根数据线将手机连上电脑&#xff08;已打开USB调式并已允许调试&#xff09; 便可以在电脑上轻松的对手机进行截屏了&#xff0c;再也不需要先截个图然后登录个QQor微信将截屏发送至电脑了。 同时支持Windows和Mac平台哦 需要安装Python3.7 不会安…

python职业发展方向_软件测试行业职业发展路径-技术方向

大家好&#xff0c;我是小文&#xff0c;今天给大家介绍下软件测试行业的职业发展路径&#xff0c;很多同学不清楚这个行业的职业发展&#xff0c;工作职责&#xff0c;特别是刚入行的从业者。接下来我带大家一起了解下我们的软件测试行业。小文讲测试-软件测试行业职业发展路径…

NoSQL Intro

在过去几年&#xff0c;关系型数据库一直是数据持久化的唯一选择&#xff0c;数据工作者考虑的也只是在这些传统数据库中做筛选&#xff0c;比如SQL Server、Oracle或者是MySQL。甚至是做一些默认的选择&#xff0c;比如使用.NET的一般会选择SQL Server&#xff1b;使用Java的可…

联发科有没有高端处理器_联发科或将成华为芯片主要供应商,中高端市场也采用联发科芯片...

美国商务部对于华为的“实体清单”管控限制将会进一步收紧&#xff0c;而这将对华为的芯片生产造成一定的负面影响&#xff0c;作为华为的麒麟处理器供应商&#xff0c;台积电已经在美国商务部收紧管控限制之前承接华为麒麟芯片的大批量订单&#xff0c;外媒爆料称台积电通过协…

password: salt + hash

对于如此重要的用户密码&#xff0c;究竟该怎样在系统中存储呢&#xff1f; “君子不立危墙”&#xff0c;对于用户密码这个烫手山芋&#xff0c;一个极端的选择是系统完全不接触密码&#xff0c;用户的身份认证转交受信任的第三方来处理。例如 OpenID 这样的解决方案。系统向受…