0

午後2時などの特定の時間にサーバー上でJavaプログラムを実行するためのヘルプが必要です(新しいファイルのインデックスを作成するため)。

Javaにはジョブと呼ばれるものがあると誰かが私に言ったが、私はそれをどのように扱うかわからない。私はこれを試しました:

 boolean cond=true;
 while(cond){
     @SuppressWarnings("deprecation")
     int heur = new Date().getHours();
     @SuppressWarnings("deprecation")
     int minute= new Date().getMinutes();
     if(heur==16 && minute==02){
         indexer.close();
         end = new Date().getTime();
         File f;
         cond=false;
     }

しかし、これでプログラムはまだ実行されています。

指定した時間にプログラムを実行するにはどうすればよいですか?

4

2 に答える 2

3

Quartzと呼ばれるAPIがあります。これは、プログラムが「ジョブ」をスケジュールできる場所であり、そのときに実行されます。

例をあげるまで、このリンクを試してください。

編集:最初に、org.quartz.Jobを実装するクラスを作成する必要があります。execute(JobExecutionContext jobExecution)それを実装するときは、「トリガー」が起動されたときに実行されるメソッドであるメソッドを実装する必要があります。

スケジュールを設定するには:

SchedulerFactory schedulerFactory = new StdSchedulerFactory();
// Retrieve a scheduler from schedule factory
Scheduler scheduler = null;
try {
    scheduler = schedulerFactory.getScheduler();
}
catch (SchedulerException e) {
    e.printStackTrace();
}

//Set up detail about the job 
JobDetail jobDetail = new JobDetail("jobDetail", "jobDetailGroup", ImplementedJob.class);
SimpleTrigger simpleTrigger = new SimpleTrigger("Trigger Name","defaultGroup", DATE);

// schedule a job with JobDetail and Trigger
scheduler.scheduleJob(jobDetail, simpleTrigger);
// start the scheduler
scheduler.start();
于 2011-06-01T12:35:14.227 に答える
2

ループ内に呼び出しがないThread.sleep()ため、100%CPUで「スピン」します(良くありません)が、とにかく貧弱な設計です。大きな改善は、「今」から実行したいときまでのミリ秒数を単純に計算してから、Thread.sleep(n)を呼び出すことです。

ただし、より良い解決策は、JDKがすでに提供しているものを使用することです。

JDK並行ライブラリのクラスを使用するこのコードを見てください。これは、機能する非常に単純な例です。

import java.util.concurrent.*;

public static void main(String[] args)
{
    ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
    Runnable runnable = new Runnable() {
        public void run()
        {
            // do something;
        }
    };

    // Run it in 8 hours - you would have to calculate how long to wait from "now"
    service.schedule(runnable, 8, TimeUnit.HOURS); // You can 
}
于 2011-06-01T13:36:02.593 に答える