Лучший способ создать фоновый поток в java

Каков наилучший способ создать фоновый поток, который будет запускаться каждые 15 минут, чтобы получить данные из базы данных?

Ниже приведен код, который будет работать нормально, я думаю, что в производстве, но есть ли другой способ, который у меня есть или что-то, о чем я должен знать?

private static void checkDatabaseEveryXMinutes() {
 new Thread() {
 public void run() {
 while (true) {
 try {
 Thread.sleep(checkingAfterEveryXMinutes);
 getDataFromDatabase();
 } catch (InterruptedException ex) {
 //log here
 } catch (Exception e) {
 //log here
 }
 }
 }
 }.start();
}

Есть ли недостаток в использовании вышеуказанного кода. И как ScheduledExecutorService сравнивается с TimerTask?

Какой способ лучше?

Любой пример базы моего кода будет оценен по этому вопросу, если есть какой-либо лучший подход.

3 ответа

ScheduledExecutorService вернет вам будущее, у которого есть дополнительный метод проверки завершения Runnable. У обоих есть методы для отмены Runnable. Для повторной задачи, подобной этой, проверка, если это будет сделано, вероятно, не будет иметь большого смысла. Однако он был введен с помощью jdk 1.5 concurrency api, который определенно следует использовать вместо более старого concurrency/​​thread api (Timer и TimerTask были jdk 1.3). Они будут более надежными и эффективными. Они имеют очень похожий пример, как ваш вариант использования в java doc здесь.

здесь образец:

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
public class ScheduledTaskExample {
 private final ScheduledExecutorService scheduler = Executors
 .newScheduledThreadPool(1);
 public void startScheduleTask() {
 /**
 * not using the taskHandle returned here, but it can be used to cancel
 * the task, or check if it done (for recurring tasks, that not
 * going to be very useful)
 */
 final ScheduledFuture<!--?--> taskHandle = scheduler.scheduleAtFixedRate(
 new Runnable() {
 public void run() {
 try {
 getDataFromDatabase();
 }catch(Exception ex) {
 ex.printStackTrace(); //or loggger would be better
 }
 }
 }, 0, 15, TimeUnit.MINUTES);
 }
 private void getDataFromDatabase() {
 System.out.println("getting data...");
 }
 public void shutdowh() {
 System.out.println("shutdown...");
 if(scheduler != null) {
 scheduler.shutdown();
 }
 }
 public static void main(String[] args) {
 final ScheduledTaskExample ste = new ScheduledTaskExample();
 Runtime.getRuntime().addShutdownHook(new Thread() {
 public void run() {
 ste.shutdowh();
 }
 });
 ste.startScheduleTask();
 }
}


Вы можете попробовать использовать java.util.TimerTask и java.util.Timer

Пример здесь: -

Timer t = new Timer();
t.scheduleAtFixedRate(
 new TimerTask()
 {
 public void run()
 {
 System.out.println("3 seconds passed");
 }
 },
 0, // run first occurrence immediately
 3000);


tieTYT прав. Если вы используете его на сервере приложений, вы можете использовать службу ejbtimer для определенного сервера.

licensed under cc by-sa 3.0 with attribution.