Лучший способ создать фоновый поток в 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. Для повторной задачи, подобной этой, проверка того, сделано ли это, вероятно, не будет большой пользы. Однако он был представлен с api параллелизма jdk 1.5, который определенно должен использоваться вместо более старых 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'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.утиль.TimerTask и java.утиль.Таймер

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

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 конкретного сервера