logo

Основы работы с Timer в Java: задачи, исключения, базы данных

Быстрый ответ

Для регулярного выполнения задач в Java можно использовать классы Timer и TimerTask:

Java
Скопировать код
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        System.out.println("Все работа да работа, программисту заняться нечем!");
    }
}, 0, 1000); // Запуск без задержки, повторение ежесекундно.

Чтобы прекратить выполнение задачи, используйте метод cancel.

Не только таймер: знакомство с Executors

Для выполнения более сложных задач, таких как работа с базами данных, удобнее использовать встроенные в Java классы ExecutorService и Future:

Java
Скопировать код
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
Callable<String> task = () -> {
    return "Соединение установлено";
};

Future<String> future = executor.schedule(task, 2, TimeUnit.MINUTES);

try {
    System.out.println(future.get(120, TimeUnit.SECONDS));
} catch (InterruptedException | ExecutionException | TimeoutException e) {
    e.printStackTrace();
} finally {
    executor.shutdown();
}

Будьте готовы к непредвиденному: обработка тайм-аутов и исключений

Не забывайте учитывать возможность возникновения тайм-аутов и исключений:

Java
Скопировать код
Future<String> future = executor.schedule(task, 1, TimeUnit.SECONDS);

try {
    System.out.println(future.get(1, TimeUnit.SECONDS));
} catch (InterruptedException | ExecutionException e) {
    e.printStackTrace();
} catch (TimeoutException e) {
    e.printStackTrace();
} finally {
    executor.shutdown();
}

Тонкости планирования: выбор метода

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

Визуализация

Настройку таймера в Java можно сравнить с выполнением кулинарного рецепта:

Markdown
Скопировать код
Если бы был рецепт  : Установите таймер на 10 мин – 🍪 Тесто готово к выпечке!
Так это в Java Timer : Установлена задержка, запущено выполнение – 💻 Ваша задача в работе!

Пример кода для настройки таймера:

Java
Скопировать код
Timer timer = new Timer();  
timer.schedule(new RemindTask(), 10000); // Подождите 10 секунд – ваша задача будет выполнена.

Если обратный отсчёт сопровожден звонком:

Markdown
Скопировать код
На кухне           : 🍪🔔 – Печенье готово!
В Java             : 💻🔔 – Задача выполнена!

Работа с задачами БД с помощью Callable и FutureTask

Если требуется больше контроля при работе с базами данных, можно воспользоваться классами Callable и FutureTask:

Java
Скопировать код
Callable<Boolean> callable = () -> {
    boolean successful = db.connect();
    return successful;
};

FutureTask<Boolean> task = new FutureTask<>(callable);

executor.execute(task);

try {
    Boolean result = task.get(2, TimeUnit.MINUTES);
    if (result) {
        System.out.println("База данных готова к работе.");
    }
} catch (TimeoutException e) {
    System.out.println("Время ожидания соединения с базой данных истекло.");
} finally {
    executor.shutdownNow();
}

Не забывайте обрабатывать исключения и контролировать время выполнения запланированных задач.

Работа с UI на Android: задачи должны выполняться в главном потоке

Для обновления пользовательского интерфейса на Android используйте главный поток:

Java
Скопировать код
Activity activity = ... // Ваш активити
timer.schedule(new TimerTask() {
    @Override
    public void run() {
        activity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                // Здесь код для UI.
            }
        });
    }
}, 0, 1000);

Так вы избежите ошибки CalledFromWrongThreadException.

Полезные материалы

  1. Timer (Java Platform SE 8) — официальная документация Oracle по классу Timer.
  2. TimerTask (Java Platform SE 8) — информация о классе TimerTask.
  3. ScheduledExecutorService (Java Platform SE 8) — для регулирования планирования выполнения задач.
  4. Java Timer vs ExecutorService? – Stack Overflow — сравнение возможностей Timer и ExecutorService.
  5. Lesson: Concurrency (The Java™ Tutorials > Essential Java Classes) — введение в многопоточность в Java.
  6. ScheduledExecutorService — детальное руководство по классу ScheduledExecutorService.