Как использовать class Timer для вызова метода, сделать что-то, сбросить таймер, повторить?

Я начинающий Java и занимаюсь различными решениями этой проблемы, и я сам стал завязан. Я пробовал с Threads, а затем открыл этот class Timer и до сих пор не работал с ним. Если бы вы могли опубликовать исполняемый код с помощью основного метода, чтобы я мог видеть, как он работает, и начать играть там, это было бы здорово.

  1. Запуск программы
  2. вызов doSomething()
  3. Генерируйте случайное число и установите для этого таймер.
  4. Когда таймер выключится, снова вызовите doSomething() .

Вероятно, используя это: http://docs.oracle.com/javase/6/docs/api/java/util/Timer.html

Если вы хотите просто использовать Таймер, я бы сделал что-то вроде этого:

 public class TestClass { public long myLong = 1234; public static void main(String[] args) { final TestClass test = new TestClass(); Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { test.doStuff(); } }, 0, test.myLong); } public void doStuff(){ //do stuff here } } 

Извините за паршивую идентификацию.

Кроме того, если вам нужно запланировать выполнение кода, взгляните на Guava Services, так как он действительно может сделать ваш код более четким и абстрактным, а не полностью шаблоном создания streamов, планирования и т. Д.

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

Для записи, если бы вы использовали Guava, это выглядело бы примерно так:

 class CrawlingService extends AbstractScheduledService { @Override protected void runOneIteration() throws Exception { //run this alot } @Override protected void startUp() throws Exception { //anything you need to step up } @Override protected void shutDown() throws Exception { //anything you need to tear down } @Override protected Scheduler scheduler() { return new CustomScheduler() { @Override protected Schedule getNextSchedule() throws Exception { long a = 1000; //number you can randomize to your heart's content return new Schedule(a, TimeUnit.MILLISECONDS); } }; } } 

И вы просто создадите главную, которая называется new CrawlingService.start (); это оно.

Вы специально хотите Timer ? Если нет, вам, вероятно, будет лучше с ScheduledExecutorService и вызовом scheduleAtFixedRate или scheduleWithFixedDelay ; цитируя Javadocs :

Java 5.0 представила пакет java.util.concurrent , и одна из утилит параллелизма в нем – ScheduledThreadPoolExecutor который является пулом streamов для многократного выполнения задач с заданной скоростью или задержкой. Это эффективно более универсальная замена комбинации Timer / TimerTask , поскольку она позволяет несколько streamов обслуживания, принимает различные единицы времени и не требует подclassа TimerTask (просто реализовать Runnable ). Настройка ScheduledThreadPoolExecutor с одним streamом делает его эквивалентным Timer .

ОБНОВИТЬ

Вот какой рабочий код используется с помощью ScheduledExecutorService :

 import java.util.Date; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class Test { public static void main(String[] args) { final ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor(); ses.scheduleWithFixedDelay(new Runnable() { @Override public void run() { System.out.println(new Date()); } }, 0, 1, TimeUnit.SECONDS); } } 

Результат выглядит так:

 Thu Feb 23 21:20:02 HKT 2012 Thu Feb 23 21:20:03 HKT 2012 Thu Feb 23 21:20:04 HKT 2012 Thu Feb 23 21:20:05 HKT 2012 Thu Feb 23 21:20:06 HKT 2012 Thu Feb 23 21:20:07 HKT 2012 

Подумайте о сценарии, когда я хочу, чтобы мой код выполнялся в определенное время в моем приложении или когда-то позже с текущего времени. Другими словами, я хочу запланировать свою задачу в определенное время.

Java Timer class (java.util.Timer) позволяет приложению планировать задачу на отдельном фоновом streamе.

Вот простейший пример Java Timer :

 import java.util.Timer; import java.util.TimerTask; public class JavaTimer { public static void main(String[] args){ Timer timer = new Timer(); TimerTask task = new TimerTask() { @Override public void run() { System.out.println("Inside Timer Task" + System.currentTimeMillis()); } }; System.out.println("Current time" + System.currentTimeMillis()); timer.schedule(task, 10000,1000); System.out.println("Current time" + System.currentTimeMillis()); } } 

 Output: Current time1455469505220 Current time1455469505221 Inside Timer Task1455469515222 Inside Timer Task1455469516222 Inside Timer Task1455469517222 Inside Timer Task1455469518222 Inside Timer Task1455469519222 Inside Timer Task1455469520222 Inside Timer Task1455469521222 Inside Timer Task1455469522222 Inside Timer Task1455469523222 Inside Timer Task1455469524222 Inside Timer Task1455469525222 Inside Timer Task1455469526222 Inside Timer Task1455469527222 Inside Timer Task1455469528223 Inside Timer Task1455469529223 and it goes on 

АНАЛИЗ: вызов timer.schedule (task, 10000,1000) планирует запланировать задачу, которая будет выполняться в первый раз (по другому streamу) через 10 секунд после этого вызова. После этого он снова вызывается после задержки 10 секунд. Здесь важно указать, что если задача не может быть запущена через 10 секунд, следующий вызов задачи не получит pre-pond. Таким образом, время задержки между двумя последовательными задачами фиксировано.

Источник: пример Java Timer

На этой странице есть хороший пример использования Timer s и TimerTask s, которые вы можете настроить для своих нужд.

Если вы не хотите использовать class таймера и можете использовать Quartz, тогда выполните его как. Мой основной class был бы

 import com.google.common.util.concurrent.AbstractScheduledService; import org.quartz.CronScheduleBuilder; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.impl.StdSchedulerFactory; import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; import static org.quartz.TriggerBuilder.newTrigger; import java.util.concurrent.CountDownLatch; public class Test { public static void main(String[] args) throws Exception{ CountDownLatch latch = new CountDownLatch(1); //do schdeuling thing JobDetail job = JobBuilder.newJob(SimpleJob.class).withIdentity( "CronQuartzJob", "Group").build(); // Create a Trigger that fires every 5 minutes. Trigger trigger = newTrigger() .withIdentity("TriggerName", "Group") .withSchedule(CronScheduleBuilder.cronSchedule("0/1 * * * * ?")) .build(); // Setup the Job and Trigger with Scheduler & schedule jobs final Scheduler scheduler = new StdSchedulerFactory().getScheduler(); scheduler.start(); scheduler.scheduleJob(job, trigger); // latch.await(); Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { @Override public void run() { try { scheduler.shutdown(); latch.countDown(); }catch (Exception e){ e.printStackTrace(); } } })); } } 

и class работы

 import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class SimpleJob implements Job { public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { System.out.println("executing task!"); } } 

Я бы создал исполняемый банку для этого и начал это с помощью java -jar .. & и Ctrl+C может остановить этот процесс. Если вы хотите, чтобы это было в фоновом режиме, disown это

Ниже код будет работать в 18:20, и он будет повторяться в интервале 5 секунд.

 public static void main(String[] args) { Timer timer = new Timer(); TimerTask tt = new TimerTask() { public void run() { Calendar cal = Calendar.getInstance(); int hour = cal.get(Calendar.HOUR_OF_DAY); int min = cal.get(Calendar.MINUTE); if (hour == 18 && min == 20) { doSomething(); } } }; timer.schedule(tt, 1000, 5000); } 
  • Таймер в UpdatePanel
  • Interesting Posts

    Сложенная гистограмма в R (ggplot2) с осью y и барами в процентах от счетчиков

    Мне нужно включить и выключить питание ЖК-монитора, чтобы он оставался включенным

    Возможно ли обновить коэффициент масштабирования окна tcp после трехстороннего рукопожатия, отправив syn / ack?

    Просмотр PDF в формах Windows с использованием C #

    Почему Firefox использует протокол / схему chrome: // в URL-адресах?

    Ваш APP_BUILD_SCRIPT указывает на неизвестный файл с помощью Android ndk-build

    Android Studio – НЕОПРЕДЕЛЕННЫЙ ТОП-УРОВЕННЫЙ ИСКЛЮЧИТЕЛЬ:

    Что такое вкладка «Альтернативная конфигурация» в настройках TCP / IP

    Какие объявления по умолчанию для типов существуют в списке вариационных аргументов?

    В Linux, какие точечные файлы и каталоги следует создать резервную копию?

    Невозможно использовать ref и out для первого («this») параметра в методах расширения?

    Android: Как вручную добавить файл в apk?

    Заполнение шаблонов для графиков

    Где хранятся временные файлы в Chrome?

    Как программно предотвратить переключение Mac на hibernate?

    Давайте будем гением компьютера.