Как вызвать поток для запуска в определенное время в java?

Я хочу, чтобы потоки выполняются в определенное точное время (например в: 2012-07-11 13:12:24 и 2012-07-11 15:23:45)

проверил ScheduledExecutorService, но он поддерживает выполнение только после определенного периода с первого запуска, и у меня нет фиксированных периодов, вместо этого у меня есть время из базы данных для выполнения задач.

в предыдущем вопросе для другой проблемы здесь, TimerTask было решением, но очевидно, что я не могу сделать поток TimerTask as Runnable и TimerTask оба имеют метод run, который должен быть реализован. Вопрос здесь, Если я сделаю поток extends TimerTask и иметь одну реализацию run(), это сработает? Если нет, то как можно сделать то, что я пытаюсь сделать?

3 ответов


Использовать TimerTask .

создайте объект TimerTask с переменной поля в качестве потока. Вызовите поток start из метода запуска задачи Timer.

public class SampleTask extends TimerTask {
  Thread myThreadObj;
  SampleTask (Thread t){
   this.myThreadObj=t;
  }
  public void run() {
   myThreadObj.start();
  }
}

настройте его следующим образом.

Timer timer  new Timer();
Thread myThread= // Your thread
Calendar date = Calendar.getInstance();
date.set(
  Calendar.DAY_OF_WEEK,
  Calendar.SUNDAY
);
date.set(Calendar.HOUR, 0);
date.set(Calendar.MINUTE, 0);
date.set(Calendar.SECOND, 0);
date.set(Calendar.MILLISECOND, 0);
// Schedule to run every Sunday in midnight
timer.schedule(
  new SampleTask (myThread),
  date.getTime(),
  1000 * 60 * 60 * 24 * 7
);

Я думаю, вам лучше использовать некоторую библиотеку, такую как Кварц Планировщик. Это в основном реализация cron для Java.


вы смотрели CountDownLatch из java.утиль.concurrent пакет? Он обеспечивает обратный отсчет, а затем запускает поток(ы) для запуска. Мне никогда не нужно было использовать его самостоятельно, но я видел его в использовании пару раз.