Java ScheduledExecutorService延迟执行任务,CPU和;内存使用

Java ScheduledExecutorService延迟执行任务,CPU和;内存使用,java,concurrency,scheduledexecutorservice,Java,Concurrency,Scheduledexecutorservice,我需要创建多个任务,每个任务每n秒执行一次。我决定使用ScheduledExecutorService来计划任务执行。问题是任务没有及时执行。我认为原因是处理器时间不够,但实际的CPU使用率约为4-5% 我的调度程序创建者: class SchedulersCreator { private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); p

我需要创建多个任务,每个任务每
n
秒执行一次。我决定使用
ScheduledExecutorService
来计划任务执行。问题是任务没有及时执行。我认为原因是处理器时间不够,但实际的CPU使用率约为4-5%

我的调度程序创建者:

class SchedulersCreator {

    private final ScheduledExecutorService scheduler
            = Executors.newScheduledThreadPool(1);

    public SchedulersCreator(int tasksAmount, int repeatCount) {
        for (int taskId = 0; taskId <= tasksAmount; taskId++) {
            // create new task, that executes every 2 seconds
            MyTask task = new MyTask(scheduler, repeatCount, 2, taskId);
            // execute new task
            task.run();
        }
    }

    public static void main(String[] args) {
        System.out.println("Program started");
        // create & start 10 tasks, each of the executes 10 times with period 2 seconds
        SchedulersCreator scheduler = new SchedulersCreator(10, 10);
        System.out.println("All tasks created & started");
    }
}
表意符处的代码:。 我预计两次执行之间的时间大约为2秒,但实际结果是3-4秒

程序输出:

...
Time since prev execution:  3028    Task 0: 2 executions lefts; current duration    1000
Time since prev execution:  4001    Task 0: 1 executions lefts; current duration    1001

您的代码未正确使用计划程序

// perform useful calculation in another thread
new Thread(() -> performAction()).run();
这实际上并不是在新线程中运行代码。为此,您需要调用
start()
,而不是
run()
。调用
run()

但是,您根本不应该显式地创建新线程。您可以而且应该在
MyTask.run()
中正确地完成这项工作

任务不需要知道调度程序或其频率。更改此代码:

MyTask task = new MyTask(scheduler, repeatCount, 2, taskId);
// execute new task
task.run();
致:

MyTask task=newmytask(repeatCount,taskId);
Future Future=scheduler.scheduleAtFixedRate(任务,0,2,秒);
如果希望任务重复,请使用执行此操作的计划程序方法。这将允许调度程序根据任务运行的时间调整任务之间的时间


将所有
performAction()
移动到
MyTask.run()
。当您希望任务停止重复时,请使用
future
取消它。

您的代码没有正确使用计划程序

// perform useful calculation in another thread
new Thread(() -> performAction()).run();
这实际上并不是在新线程中运行代码。为此,您需要调用
start()
,而不是
run()
。调用
run()

但是,您根本不应该显式地创建新线程。您可以而且应该在
MyTask.run()
中正确地完成这项工作

任务不需要知道调度程序或其频率。更改此代码:

MyTask task = new MyTask(scheduler, repeatCount, 2, taskId);
// execute new task
task.run();
致:

MyTask task=newmytask(repeatCount,taskId);
Future Future=scheduler.scheduleAtFixedRate(任务,0,2,秒);
如果希望任务重复,请使用执行此操作的计划程序方法。这将允许调度程序根据任务运行的时间调整任务之间的时间

将所有
performAction()
移动到
MyTask.run()
。当您希望任务停止重复时,请使用
future
取消该任务