Подтвердить что ты не робот

Как использовать класс Timer для вызова метода, сделать что-нибудь, reset timer, repeat?

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

  • Запустить программу
  • вызов doSomething()
  • Сгенерируйте случайное число и установите Timer таким образом.
  • Когда Таймер выключен, снова вызовите doSomething().

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

4b9b3361

Ответ 1

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

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, поскольку он действительно может сделать ваш код намного понятнее и абстрактное довольно немного шаблона создания потоков, планирования и т.д.

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

Для записи, если бы вы использовали 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 content
                return new Schedule(a, TimeUnit.MILLISECONDS);
            }
        };
    }
}

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

Ответ 2

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

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

UPDATE

Здесь некоторый рабочий код с использованием 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

Ответ 3

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

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

Вот простейший пример 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) планируется запланировать задачу, которая будет выполняться в первый раз (в другом потоке) через 10 секунд после этого вызова. После этого он снова вызывается после задержки 10 секунд. Здесь важно указать, что если задача не может быть запущена через 10 секунд, следующий вызов задачи не получит pre-pond. Таким образом, время задержки между двумя последовательными задачами фиксировано.

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

Ответ 4

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

Ответ 5

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

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();
                }
            }
        }));

    }






}

и класс задания будет

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 он