Лучший способ создать фоновый поток в 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 вернет вам Future, у которого есть дополнительный метод, чтобы проверить, завершен ли Runnable. Оба имеют методы для отмены Runnable. Для повторяющейся задачи, подобной этой, проверка выполнения этой задачи, вероятно, не принесет особой пользы. Тем не менее, он был представлен с API параллелизма jdk 1.5, который определенно должен использоваться вместо более старых API параллелизма / потока (Timer и TimerTask были jdk 1.3). Они будут более надежными и эффективными. У них очень похожий пример, как ваш пример использования в документе Java здесь.

вот образец:

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's done (for recurring tasks, that's 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 конкретного сервера

Другие вопросы по тегам