首页 > 其他分享 >线程池测试类-TEST

线程池测试类-TEST

时间:2023-01-03 23:01:53浏览次数:63  
标签:log Thread dataList import static 测试 new TEST 线程

package com.javacode2022.threadpool;

import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author:lijinhao
 * @date:2022/9/5 22:42
 * @useful:
 * @modify
 * ===================================================
 *  modifier            modifytime                description
 * ===================================================
 */
@Slf4j
public class WebSysDemo1 {
    /*// 创建一个操作Thread中存放请求任务追踪id口袋的对象
    static ThreadLocal<String> traceIdKD = new ThreadLocal<>();*/
    // 创建一个操作Thread中存放请求任务追踪id口袋的对象,自线程可以继承父线程中的内容
    static InheritableThreadLocal<String> traceIdKD = new InheritableThreadLocal<>();
    static AtomicInteger threadIndex = new AtomicInteger(0);
    // 处理请求的线程池
    static ThreadPoolExecutor disposeRequestExecutor = new ThreadPoolExecutor(3, 3, 60,
            TimeUnit.SECONDS, new LinkedBlockingDeque<>(), r -> {
        Thread thread = new Thread(r);
        thread.setName("pooThread--" + threadIndex.incrementAndGet());
        return thread;
    });

    // 记录日志
    public static void log(String msg) {
        /*log.info(msg);*/
        String traceId = traceIdKD.get();
        log.info("[模拟请求{}] {}", traceId, msg);
    }

    // 模拟controller
    public static void controller(List<String> dataList) {
        log("接收请求");
        service(dataList);
    }

    // 模拟service
    public static void service(List<String> dataList) {
        log("执行业务");
//        dao(dataList);
        daoNew(dataList);
    }

    // 模拟dao
    public static void dao(List<String> dataList) {
        log("执行数据库操作");
//        for (String s : dataList) {
//            log("插入数据" + s + "成功");
//        }
        dataList.forEach(data -> {
            log("插入数据" + data + "成功");
        });
    }

    // 模拟dao(多线程并发执行)
    public static void daoNew(List<String> dataList) {
        int dataSize = dataList.size();
        CountDownLatch countDownLatch = new CountDownLatch(dataSize);
        log("执行数据库操作(多线程)");
        String threadName = Thread.currentThread().getName();

        // 模拟插入数据
        dataList.forEach(data ->{
            new Thread(()->{
                // 模拟数据库操作耗时100毫秒
                try {
                    TimeUnit.MILLISECONDS.sleep(100);
                    log("插入数据["+ data + "]成功,主线程:" + threadName);
                } catch (InterruptedException e) {
                    log.error("你的程序异常啦!!!", e);
                } finally {
                    countDownLatch.countDown();
                }
            }).start();
        });

        // 等待上边的dataList处理完毕
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            log.error("你的程序异常啦!!!", e);
        }
    }

    public static void main(String[] args) {
        List<String> dataList = new ArrayList<>();
        for (int i = 0; i < 3; i++) {
            dataList.add("数据" + i);
        }
        log.info("{} 初始化数据完毕,dataList = {}" , Thread.currentThread().getName(),dataList);
        // 模拟5个请求
        int requestCount = 5;
        for (int i = 0; i < requestCount; i++) {
            String traceId = String.valueOf(i+1);
            disposeRequestExecutor.execute(() -> {
                try {
                    traceIdKD.set(traceId);
                    controller(dataList);
                } finally {
                    traceIdKD.remove();
                }
            });
        }
        disposeRequestExecutor.shutdown();
        log.info("模拟5个请求结束!");
    }
}

标签:log,Thread,dataList,import,static,测试,new,TEST,线程
From: https://www.cnblogs.com/shanzhidian/p/17023625.html

相关文章

  • 40. Testing Prev Part IV. Spring Boot features
    40. TestingSpringBootprovidesanumberofutilitiesandannotationstohelpwhentestingyourapplication.Testsupportisprovidedbytwomodules; ​​spri......
  • jstack和线程dump分析
          jstack命令的语法格式:jstack <pid>。可以用jps查看java进程id。这里要注意的是:      1.不同的JAVA虚机的线程DUMP的创建方法和文件格式是不一样的,......
  • USACO 2019 US Open Contest, Silver
    USACO2019USOpenContest,SilverT1.SleepyCowHerding这道题是个结论题我们先找出最大连续子段,如果全部连续,则不用计算求最大值,就尽量把所有的空位都踩一遍,我们......
  • 进程和线程关系
     进程是系统进行资源分配的基本单位,有独立的内存地址空间;线程是CPU调度的基本单位,没有单独地址空间,有独立的栈,局部变量,寄存器,程序计数器等只有进程有自己的addressspace......
  • 使用SIPp进行压力测试
    本文更新于2022-05-14,使用SIPpv3.5.3。官网:http://sipp.sourceforge.net/。中文文档:http://sipp.sourceforge.net/doc/cn-reference.pdf。安装其它版本请于官网下载。......
  • [Leetcode Weekly Contest]326
    链接:LeetCode[Leetcode]2520.统计能整除数字的位数给你一个整数num,返回num中能整除num的数位的数目。如果满足nums%val==0,则认为整数val可以整除nums......
  • 性能测试技术笔记(二):如何准备测试环境和数据
    这篇文章,继续分享工作笔记中关于性能测试的内容。上一篇文章聊了如何快速上手压测工作的几个切入点和注意事项,这些内容可以帮助我们更快的介入项目。但实际工作中,前期的......
  • Java线程同步总结
    线程同步的关键是保证临界资源访问的原子性和可见性。一般的解决方案是使用volatile(保证可见性、不一定保证原子性)修饰共享变量,或是加锁(直接保证原子性和可见性)进行线程同......
  • airtest初步使用
    之前遇到了一个线上问题,大商家反馈说下面有几个导购进入企微工作台点击图标没有反应。和开发一起通过日志排查和手动点击没有复现问题,但商家说多次遇到了,怀疑是概率性的问......
  • 4. 识别线程
    识别线程线程表示类型为std::id可以通过两种方式进行检索第一种可以通过std::thread的对象成员函数get_id()来直接获取第二种是在当前线程中调用std::get_id()vo......