使用 Java 进行负载测试 - 计时器任务与调度程序
Load Test using Java - timer task vs scheduler
我需要使用 Java 执行负载测试,其中一种测试策略要求在每 y 时间段内触发 x 个线程,持续 z 分钟,此后总线程数保持不变 运行 负载测试持续时间(例如,总共有 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 class 一起使用,如下所示:
我使用 Executors.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);
这样每intervalLength增加并发线程数incrementAmount
我需要使用 Java 执行负载测试,其中一种测试策略要求在每 y 时间段内触发 x 个线程,持续 z 分钟,此后总线程数保持不变 运行 负载测试持续时间(例如,总共有 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 class 一起使用,如下所示:
我使用 Executors.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);
这样每intervalLength增加并发线程数incrementAmount