Как связать таймеры друг с другом?

В Java есть несколько способов связать таймеры друг с другом в зависимости от ваших конкретных требований. Рассмотрим несколько из них:

1. Использование класса TimerTask:

Класс TimerTask является абстрактным классом, который реализует интерфейс Runnable. Вы можете создать собственный класс, расширяющий TimerTask, и переопределить метод run(), в котором будет содержаться код выполнения конкретной задачи. Затем можно использовать метод schedule() класса Timer, чтобы запланировать выполнение этой задачи по определённому расписанию.

Пример кода:

import java.util.Timer;
import java.util.TimerTask;

public class Main {
   public static void main(String[] args) {
      TimerTask task1 = new TimerTask() {
         public void run() {
            System.out.println("Task 1");
         }
      };
      
      TimerTask task2 = new TimerTask() {
         public void run() {
            System.out.println("Task 2");
         }
      };
      
      Timer timer = new Timer();
      timer.schedule(task1, 0, 1000); // Запуск задачи task1 сразу и повторяем каждую секунду
      timer.schedule(task2, 500, 2000); // Запуск задачи task2 через 0.5 секунды и повторяем каждые 2 секунды
   }
}

В данном примере мы создали две задачи task1 и task2, каждая из которых будет выводить текст в консоль. Затем мы использовали метод schedule() класса Timer, чтобы запланировать выполнение задач по определённому расписанию.

2. Использование класса ScheduledExecutorService:

В Java также есть более гибкий и удобный способ запланировать выполнение задач - использование класса ScheduledExecutorService. Он предоставляет методы для планирования выполнения задач с определёнными задержками или периодичностью.

Пример кода:

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Main {
   public static void main(String[] args) {
      ScheduledExecutorService executor = Executors.newScheduledThreadPool(2);
      
      Runnable task1 = new Runnable() {
         public void run() {
            System.out.println("Task 1");
         }
      };
      
      Runnable task2 = new Runnable() {
         public void run() {
            System.out.println("Task 2");
         }
      };
      
      executor.scheduleAtFixedRate(task1, 0, 1, TimeUnit.SECONDS); // Запуск задачи task1 сразу и повторяем каждую секунду
      executor.scheduleWithFixedDelay(task2, 0, 2, TimeUnit.SECONDS); // Запуск задачи task2 сразу и повторяем через две секунды после завершения предыдущего запуска
   }
}

В данном примере мы создали две задачи типа Runnable task1 и task2. Затем мы использовали методы scheduleAtFixedRate() и scheduleWithFixedDelay() класса ScheduledExecutorService, чтобы запланировать выполнение задач по определённому расписанию. Они позволяют указывать задержку перед первым запуском и периодичность повторения задачи.

Это лишь два примера способов связать таймеры друг с другом в Java. Выбор конкретного подхода зависит от требований вашей программы и вашего стиля программирования.