最近在写多线程测试程序的时候遇到了一些问题,根据参考及自己实践,做记录如下
Java中同时启动多个线程并传入不同参数
threadLocal原理及说明参考
Java中同时启动多个线程(CountDownLatch)
Java向线程传入参数
Java向线程传入参数的三种方法
可以通过构造器或者set的方式,或者回调函数传入
同时启动多个线程并传入不同的参数(自己练习)
方式一:使用threadLocal+CountDownLatch
- threadLocal用于存储线程的局部变量,不同的线程启动后存入线程各自的参数,然后去获取。
- CountDownLatch用于控制线程同时启动
public class Test {
ThreadLocal<String> threadLocal=new ThreadLocal<String>();
@Test
public void findOrderSplitDetailsTest() throws InterruptedException {
QueryOrderByPayReqVo reqVo=new QueryOrderByPayReqVo();
reqVo.setOrderId("56290014401");
orderQueryResource.findOrderSplitDetails(reqVo);
Thread.sleep(1000L);
CreateOrderReqVo reqVo1=new CreateOrderReqVo();
reqVo1.setPayMode(2);
reqVo1.setParentOrderId("56290014401");
reqVo1.setOrderId("56308748910");
CountDownLatch countDownLatch = new CountDownLatch(3);
for (int i=0; i<3; i++) {
//本意是这样实现给不同的线程传入不同的参数,然后因为reqVo是myThread1中的成员变量,不是run方法中的局部变量,所以是不对的
/*if(i==1){
reqVo1.setOrderId("56308748911");
}else if(i==2){
reqVo1.setOrderId("56308748912");
}*/
Thread thread = new Thread(new myThread1(reqVo1,countDownLatch));
thread.setName("线程-" + (i+1));
thread.start();
countDownLatch.countDown();
}
Thread.sleep(1000L);
}
public class myThread1 implements Runnable{
CreateOrderReqVo reqVo;
private final CountDownLatch countDownLatch;
public myThread1(CreateOrderReqVo reqVo,CountDownLatch countDownLatch){
this.reqVo=reqVo;
this.countDownLatch=countDownLatch;
}
@SneakyThrows
@Override
public void run