web-dev-qa-db-ja.com

Timerクラスを使用してメソッドを呼び出し、何かをし、タイマーをリセットし、繰り返しますか?

私はJava初心者であり、この問題のさまざまな解決策をいじくり回しており、一種の結びつきを感じています。 実行可能なコードをメインメソッドで投稿できるなら、私はそれが動作し、そこから遊び始めることができると、素晴らしいことだ。

  1. プログラムを起動する
  2. doSomething()を呼び出します
  3. 乱数を生成し、その長いタイマーを設定します。
  4. タイマーがオフになったら、doSomething()を再度呼び出します。

おそらくこれを使用して: http://docs.Oracle.com/javase/6/docs/api/Java/util/Timer.html

27
chrisco

単純にTimerを使用する場合は、次のようにします。

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's content
                return new Schedule(a, TimeUnit.MILLISECONDS);
            }
        };
    }
}

そして、新しいCrawlingService.start()というメインを作成するだけです。それでおしまい。

42
pcalcao

特にTimerが必要ですか?そうでない場合は、おそらく ScheduledExecutorService を使用して、scheduleAtFixedRateまたはscheduleWithFixedDelayを呼び出した方がよいでしょう。 Javadocs を引用する:

Java 5.0はJava.util.concurrentパッケージを導入し、その中の同時実行ユーティリティの1つはScheduledThreadPoolExecutorです。これは、指定されたレートまたは遅延でタスクを繰り返し実行するためのスレッドプールです。これは、複数のサービススレッドを許可し、さまざまな時間単位を受け入れ、Timerのサブクラス化を必要としないため(TimerTaskを実装するだけ)、TimerTask/Runnableの組み合わせをより効果的に置き換えます。 ScheduledThreadPoolExecutorを1つのスレッドで構成すると、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
25
SimonC

アプリケーションの特定の時間に、または現在の時間から後のある時間にコードを実行するシナリオを考えてください。つまり、特定の時間にタスクをスケジュールしたいのです。

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秒後にタスクを開始できない場合、次のタスク呼び出しは事前に取得されないことです。したがって、ここでは2つの連続したタスク間の遅延時間が固定されています。

ソース: Javaタイマーの例

3
Java Guru

タイマークラスを使用したくなく、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!");
    }


}

このための実行可能jarを作成し、Java -jar .. &を使用してこれを開始し、Ctrl+Cはそのプロセスを停止できます。バックグラウンドでそれが必要な場合はdisownit

1
Dhruv Pal

このページ には、必要に応じて微調整できるTimersとTimerTasksの使用例があります。

0

以下のコードは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);
}
0
deepesh kumar