负载测试使用Java定时器任务与调度程序



我需要使用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

最新更新