利用闭包实现自定义等待方法

我在最近学习多线程编程的过程中,时长需要测试各类多线程工具类或者框架在各种线程数下的性能。基本的思路就是准备数据,编写用例方法,执行用例方法,最后等待结束,统计计算测试数据。

其中倒数第二个步骤:等待结束,之前我在Java自定义异步功能实践文章中用到看java.util.concurrent.Phaser这个多线程同步类完成。但是在最近的异步编程实践中,我用到了更多闭包的语法,例如:

    public static void main(String[] args) {
        //自定义异步任务
        def funtester = {
            fun {
                //syncDoingsomething()
            }
        }
        //单开10个线程执行异步任务
        10.times {funtester()}
    }

通过闭包的语法将异步任务的内容封装成另外一个方法,然后通过多次执行异步方法来完成多线程任务,这样写比较简单,而且非常具有可读性,如果使用java.util.concurrent.Phaser作为第二个参数,显得有些凌乱,不够优雅,比如:

    public static void main(String[] args) {
        def phaser = new Phaser(10)
        //自定义异步任务
        def funtester = {
            fun({
                //syncDoingsomething()
            }, phaser)
        }
        //单开10个线程执行异步任务
        10.times {funtester()}
    }

所以我就有了一个单独实现自定义等待方法的需求,就是设置一个或者多个判定条件,一直等待这个判定条件和条件组合符合预期,才释放当前线程,继续运行下去。经过了之前的异步和闭包的学习,我很快找到了一个简单的解决方案。如下:

    /**
     * 自定义等待,间隔0.5s
     *
     * @param f
     */
    public static void waitFor(Supplier<Boolean> f) {
        while (!f.get()) {
            sleep(0.5);
        }
    }

使用方法介绍:场景,我们需要10个线程分别计算某一类数据结果,然后将数据结果存入一个列表中(需线程安全,不然会偶发数量对不上),按照上面的思路,就是执行完10个异步任务,然后等待所有线程执行完。我使用了列表长度作为等待对象,代码如下:

        waitFor({ts.size() > 10})
        //下面也行
        waitFor {ts.size() > 10}

最近会对Java各种队列进行压测,会用到这个功能,欢迎持续关注。

PS:本文使用Groovy,若无特殊需求,我一般使用Groovy作为脚本语言。

Have Fun ~ Tester !

posted @   FunTester  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
历史上的今天:
2020-01-06 单元测试用例
点击右上角即可分享
微信分享提示