当前位置: 首页 > news >正文

验证线程池扩展能力的测试方法的问题

java并发编程实战中第12章 12.1.3中验证线程池扩展能力的测试方法:

原例中有个bug:

代码中没有给newFixedThreadPool()传递threadFactory对象,所以怎么运行threadFactory.numCreated.get()都是0.


正确代码(可直接运行):

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;

public class TestingThreadFactory implements ThreadFactory{
    public final AtomicInteger numCreated = new AtomicInteger();
    private final ThreadFactory factory = Executors.defaultThreadFactory();

    @Override
    public Thread newThread(Runnable r) {
        numCreated.incrementAndGet();
        return factory.newThread(r);
    }

    public static void main(String[] args) throws Exception {
        TestingThreadFactory threadFactory = new TestingThreadFactory();
        int MAX_SIZE = 10;
        ExecutorService exec = Executors.newFixedThreadPool(MAX_SIZE,threadFactory);

        for (int i = 0; i < 10 * MAX_SIZE; i++) {
            exec.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(Long.MAX_VALUE);
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                    }
                }
            });
        }

        for (int i = 0; i < 20 && threadFactory.numCreated.get() < MAX_SIZE; i++) {
            Thread.sleep(100);
        }
        System.out.println(threadFactory.numCreated.get());
        exec.shutdown();
    }
}

因为newFixedThreadPool是定长线程池,不能扩展,所以如果任务数小于MAX_SIZE,那么只会创建任务数量个线程,如果任务数大于MAX_SIZE,那么最多创建MAX_SIZE个线程。

最后i < 20 && threadFactory.numCreated.get() < MAX_SIZE是为了保证线程池中的已经有足够数量的任务执行了execute(或运行中或等待中),要求2秒后停止等待,或者当运行中的线程数量超过了MAX_SIZE,表明当前线程池有扩展的能力,所以也会停止等待,继续执行。


参考:
验证线程池扩展能力的测试方法_iCheetor-CSDN博客

相关文章:

  • win10 wifi有时候搜索不到
  • Mac 命令行关闭和打开蓝牙
  • AirPods Pro 卡顿或突然没声音的原因之一
  • 学习Git
  • git branch -f的作用
  • 谷歌浏览器mac切换标签快捷键
  • Plugin ‘org.springframework.boot:spring-boot-maven-plugin:‘ not found
  • java命名变量为什么要用clazz
  • ForestBlog博客源码学习笔记
  • Could not find artifact org.springframework.boot的原因之一
  • Win10登录微软账号说发生了错误的解决方式
  • 安装易语言后需要做的事情
  • 为什么在重写equals方法的时候需要重写hashCode方法
  • 访问Windows网络共享文件的默认账号密码
  • 小米笔记本重装系统后触摸板失灵 的原因之一
  • [译]如何构建服务器端web组件,为何要构建?
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • egg(89)--egg之redis的发布和订阅
  • ES6简单总结(搭配简单的讲解和小案例)
  • JAVA并发编程--1.基础概念
  • js如何打印object对象
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • nodejs实现webservice问题总结
  • PHP 7 修改了什么呢 -- 2
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 警报:线上事故之CountDownLatch的威力
  • 前端设计模式
  • 设计模式走一遍---观察者模式
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 我感觉这是史上最牛的防sql注入方法类
  • 新书推荐|Windows黑客编程技术详解
  • 用jquery写贪吃蛇
  • 用Python写一份独特的元宵节祝福
  • 再谈express与koa的对比
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • #laravel 通过手动安装依赖PHPExcel#
  • (1)Nginx简介和安装教程
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (顺序)容器的好伴侣 --- 容器适配器
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转载)CentOS查看系统信息|CentOS查看命令
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .gitignore文件—git忽略文件
  • .Net 4.0并行库实用性演练
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)