我需要使用Java执行一个负载测试,其中一个测试策略需要在z分钟内每y段时间触发x个线程,然后在负载测试持续时间内运行一个恒定的线程总数(例如,总共有100个线程,每5秒启动10个线程,直到所有100个线程都启动)。并在指定的测试持续时间内继续保持所有100个线程运行(一旦执行完成,应该重新启动),例如一小时)
我已经尝试使用定时器任务,但它似乎有限,线程池调度器是一个更好的选择?最好的方法是什么?
public class MyTask extends TimerTask{
public void run() {
System.out.println("STARTING THREAD "+ counter +" "+ new Date());
//execute test
counter++;
if (counter > maxIterations) {
MyTask.this.cancel();
return;
}
}
List<TimerTask> MyTaskList = new ArrayList<TimerTask>();
for (int i = 1 ; i <= threadsPerIteration ; i++) {
TimerTask MyTimerTask = new MyTask(NumberOfIterations);
MyTaskList.add(MyTimerTask);
timer.schedule(MyTimerTask, initialDelayMilli, threadDelayMilli);
}
谢谢
不要为每个线程使用一个TimerTask。相反,使用单个TimerTask,它每间隔触发一次,您的示例数字每5秒触发一次。
每次触发前10次TimerTask,都会产生10个线程。在每个后续触发中,它检查活动线程的数量,并生成足够的新线程,使总数达到100,直到测试结束。
感谢您的帮助,我决定将线程池执行器与timertask类一起使用,如下所示:
我使用了executor。newScheduledThreadPool(int x)方法来控制能够并发运行的线程数量,以及一个计时器任务,该任务被设置为每y次增加线程池大小:
TimerTask DelayTimerTask = new TimerTask() { //task to increase threadpool size
public void run() {
MyExecutor.setCorePoolSize(i * incrementAmount); //timer task increments threadpool size by threadPoolIncrement
i++;
}
};
timer.scheduleAtFixedRate(DelayTimerTask,0,intervalLength);
通过这种方式,并发线程的数量将增加incrementAmount每intervallth