ThreadPoolTaskScheduler запускает задачи и почему будущее такое же? - PullRequest
0 голосов
/ 27 декабря 2018

Это treadpooltaskscheduler код:

@Autowired
private ThreadPoolTaskScheduler threadPoolTaskScheduler;

private ScheduledFuture<?> future;

@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
     threadPoolTask.setPoolSize(10);
     return new ThreadPoolTaskScheduler();
}

Это сервисный код запуска и остановки задачи:

public void taskStartService(int id) {
    Optional<Task> taskOptional = taskRepository.findById(id);
    if (taskOptional.isPresent()) {
        future = threadPoolTaskScheduler.schedule(() -> {
              System.out.println("task-" + id + ", " + Thread.currentThread().getName() + "-" + Thread.currentThread().getId() + ", " + future);
        }, new CronTrigger(taskOptional.get().getTaskTime()));
    }
}
public void taskStopService(int id){
    if (taskRepository.findById(id).isPresent()) {
        if (future != null) {
            future.cancel(true);
        }
}

при запуске приложения, запуске 2 задач и печати«будущее», я считаю, что «будущее» такое же

Ответы [ 4 ]

0 голосов
/ 27 декабря 2018

case 1: Ваш размер ThreadPoolTaskScheduler равен 1

case 2. Слишком короткое время выполнения вашей задачи

Вы можете предоставить больше кода?

0 голосов
/ 27 декабря 2018

defaultPoolSize по умолчанию = 1. Таким образом, ваши задачи выполняются в одном потоке.

Вы должны использовать setPoolSize для установки размера пула потоков.

0 голосов
/ 27 декабря 2018

ThreadPoolTaskScheduler не является Java-классом.Поэтому я предполагаю, что это либо сторонний класс, либо ваш собственный класс.Правильное место для решения этой проблемы - в вашем коде:

@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
     return new ThreadPoolTaskScheduler();
}

Если у класса ThreadPoolTaskScheduler есть конструктор, который принимает количество потоков (как и должно быть), просто укажите его там или, еслиСуществует отдельный метод установки для числа потоков, чем изменение кода выше, чтобы сначала создать экземпляр, а затем установить количество потоков.Так что это будет что-то вроде:

@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
     return new ThreadPoolTaskScheduler(10);
}

или

@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
     ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
     threadPoolTaskScheduler.setThreads(10)
     return threadPoolTaskScheduler;
}
0 голосов
/ 27 декабря 2018

Я думаю, вам просто нужно

Thread.sleep(10000) 
...