2012-02-23 6 views
22

は、私は、Java初心者だと、この問題に対する様々な解決策の周りfutzingされていると私は一種のアップ結び目頂いております。私はスレッドで試してみて、このTimerクラスを発見し、これまで成功していなかったのです。メインメソッドで実行可能コードを投稿して、それが動作しているのを見てそこから再生し始めることができれば、それは素晴らしいことでしょう。Timerクラスを使用してメソッドを呼び出す方法、何かをしたり、タイマをリセットしたり、繰り返しますか?

  1. 起動プログラム
  2. コールdoSomething()
  3. は、乱数を生成し、その長いためにタイマーを設定します。タイマーがオフになると
  4. 、再びdoSomething()を呼び出します。おそらく、この使用

http://docs.oracle.com/javase/6/docs/api/java/util/Timer.html

+0

タイマーでこれをしないでください。 java.util.concurrentのものを使用してください。理解しやすく、パフォーマンスが高く、より堅牢です。下のSimonCの例は、それを行う上でのまともな方法です。 – kittylyst

答えて

32

、私はでしょう次のようなことをしてください:

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を見てみましょうところで、私は乱数などの生成の手間をかけることはありませんでしたが、あなたはその部分をどのように含めるかを理解できると思います。私はこれが正しい軌道上であなたを得るのに十分であることを願っています。レコードの

あなたはグアバを使用した場合、それはこのようなものになります。)

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(と呼ばれるそのメインを作成します。それでおしまい。

0

This pageあなたが微調整をすることができ、あなたのニーズに合わせてTimer sおよびTimerTask秒を使用しての良い例があります。

22

は、あなたが、具体的Timerをしたいですか?そうでない場合は、ScheduledExecutorServiceでお気軽にscheduleAtFixedRateまたはscheduleWithFixedDelayに電話する方が良いでしょう。 Javadocsを引用:

のJava 5.0 java.util.concurrentパッケージを導入し 並行処理ユーティリティの1つは、その中 が繰り返し与えられる速度または 遅延でタスクを実行するためのスレッドプールでScheduledThreadPoolExecutorあります。それは 、様々な時間単位を受け付け、(ちょうどRunnableを実装する)TimerTask をサブクラス化を必要としない、複数のサービススレッドを可能にするように、それは、効果的 Timer/TimerTask組み合わせのためのより汎用性の置換です。 1つのスレッドで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 
2

アプリケーションで特定の時刻に、または現在の時刻から後で実行するようにコードを実行するシナリオを考えてみましょう。言い換えれば、私は一定の時間に自分の仕事をスケジュールしたいと思う。

Java Timer class(java.util.Timer)を使用すると、アプリケーションは別のバックグラウンドスレッドでタスクをスケジュールできます。ここで

は、最も単純なexample of 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への呼び出し(タスク、10000,1000)を実行しようとしているタスクをスケジュールしようとしていますこの呼び出しから10秒後に初めて(別のスレッドで)その後、10秒後に再度電話します。 10秒後にタスクを開始できない場合は、次のタスクコールには池がかからないことに注意することが重要です。ここでは、2つの連続するタスク間の遅延時間が固定されています。

出典:Java Timer Example

0

あなたはTimerクラスを使用しないと、その後のようにそれを実行クォーツを使用することができます。私のメインクラスは、私は、このための実行可能なjarファイルを作成し、java -jar .. &を使用して、これを起動し、バックグラウンドでそれをしたい場合はCtrl+Cは、そのプロセスを停止することができます

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!"); 
    } 


} 

だろうだろうdisown it

関連する問題