使用 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