Основы работы с Timer в Java: задачи, исключения, базы данных
Быстрый ответ
Для регулярного выполнения задач в Java можно использовать классы Timer
и TimerTask
:
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println("Все работа да работа, программисту заняться нечем!");
}
}, 0, 1000); // Запуск без задержки, повторение ежесекундно.
Чтобы прекратить выполнение задачи, используйте метод cancel
.
Не только таймер: знакомство с Executors
Для выполнения более сложных задач, таких как работа с базами данных, удобнее использовать встроенные в Java классы ExecutorService
и Future
:
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();
}
Будьте готовы к непредвиденному: обработка тайм-аутов и исключений
Не забывайте учитывать возможность возникновения тайм-аутов и исключений:
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 можно сравнить с выполнением кулинарного рецепта:
Если бы был рецепт : Установите таймер на 10 мин – 🍪 Тесто готово к выпечке!
Так это в Java Timer : Установлена задержка, запущено выполнение – 💻 Ваша задача в работе!
Пример кода для настройки таймера:
Timer timer = new Timer();
timer.schedule(new RemindTask(), 10000); // Подождите 10 секунд – ваша задача будет выполнена.
Если обратный отсчёт сопровожден звонком:
На кухне : 🍪🔔 – Печенье готово!
В Java : 💻🔔 – Задача выполнена!
Работа с задачами БД с помощью Callable и FutureTask
Если требуется больше контроля при работе с базами данных, можно воспользоваться классами Callable
и FutureTask
:
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 используйте главный поток:
Activity activity = ... // Ваш активити
timer.schedule(new TimerTask() {
@Override
public void run() {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
// Здесь код для UI.
}
});
}
}, 0, 1000);
Так вы избежите ошибки CalledFromWrongThreadException
.
Полезные материалы
- Timer (Java Platform SE 8) — официальная документация Oracle по классу
Timer
. - TimerTask (Java Platform SE 8) — информация о классе
TimerTask
. - ScheduledExecutorService (Java Platform SE 8) — для регулирования планирования выполнения задач.
- Java Timer vs ExecutorService? – Stack Overflow — сравнение возможностей Timer и ExecutorService.
- Lesson: Concurrency (The Java™ Tutorials > Essential Java Classes) — введение в многопоточность в Java.
- ScheduledExecutorService — детальное руководство по классу ScheduledExecutorService.