ホームページ >Java >&#&ベース >Javaでタスクを定期的に実行する方法

Javaでタスクを定期的に実行する方法

angryTom
angryTomオリジナル
2019-11-14 16:41:365134ブラウズ

Javaでタスクを定期的に実行する方法

java でメソッドを定期的に実行する方法

Java でタイミング関数を実装する方法はたくさんあります。

1. スレッドを作成します。

import java.util.Date;
public class ThreadTest {
    public static void main(String[] args) {
        // 设置执行周期
        final long timeInterval = 3000;
        
        Runnable runnable = new Runnable() {
            public void run() {
                while (true) {
                    System.out.println("Task Run ... " + new Date());
                    
                    try {
                        Thread.sleep(timeInterval);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        };
        Thread thread = new Thread(runnable);
        thread.start();
    }
}

2. JDK に付属の API タイマーとタスクタイマーを使用します。

この方法と最初の単純で粗雑な方法の違いは何ですか? 主に、API を使用して指定した時間にタスクを開始できることと、最初のタスクを延期することができます 一定の時間間隔を設定することもできますが、原理は同じです スレッドは依然としてバックグラウンドで開始されます タスクを実行するスレッドは 1 つだけであると言えます。私たちが始める多くのタスク。たとえば、あるタスクが完了せずに別のタスクの実行が開始されると、同時実行性の問題が発生する可能性があります。また、タスクでエラーが報告された場合、スレッドは停止されます。

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class MyTask extends TimerTask{

    private String name;
    
    public MyTask(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String format = sf.format(new Date());
        System.out.println("exec MyTask ... 当前时间为:" + format);
        System.out.println(this.name +" 正在执行!" + sf.format(new Date()));
    }
    
    public static void main(String[] args) {
        Timer timer = new Timer();
        TimerTask task1 = new MyTask("Tasks 1");
        TimerTask task2 = new MyTask("Tasks 2");
        
        Calendar calendar1 = Calendar.getInstance();
        calendar1.add(Calendar.SECOND, 3);
        Calendar calendar2 = Calendar.getInstance();
        calendar2.add(Calendar.SECOND, 5);
        
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String format = sf.format(new Date());
        System.out.println("当前时间为:" + format);
        
        timer.schedule(task1, calendar1.getTime(), 3000L);
        timer.schedule(task2, calendar2.getTime(), 3000L);
    }

}

実際には、Timer はタスク キューとタイム スレッド オブジェクトをカプセル化し、カスタム タスク参照は実行を待機するキューに配置されます。

これは大まかに言うと、Timer - TimerThread - TaskQueue - MyTask - run の関係です。 もちろん、最終的な実行メソッドはカスタム タスクの run メソッドでなければなりません。これは、カスタム タスクが TimeTask を継承しており、このクラスが Runnable インターフェイスを実装しているためです。

3. ScheduledExecutorService を使用する

ScheduledExecutorService は同時実行ツール クラスとして導入され、スケジュールされたタスクを実装する最も理想的な方法です。

1. Timer のシングル スレッドと比較して、スレッド プールを通じてタスクを実行します。

2. 最初のタスク実行の遅延時間を柔軟に設定できます。

3. 実行間隔を設定するための適切な規則を提供します。

import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class qwe {
    public static void main(String[] args) {
        //新建定时任务
        Runnable runnable = new Runnable() {
            //run方法中是定时执行的操作
            public void run() {
                System.out.println(new Date());
            }
        };
        ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
        /*
         * 参数一:command:执行线程
         * 参数二:initialDelay:初始化延时
         * 参数三:period:两次开始执行最小间隔时间
         * 参数四:unit:计时单位
         */
        service.scheduleAtFixedRate(runnable, 0, 60, TimeUnit.SECONDS);
    }
}

php 中国語の Web サイト、多数の無料の Java 入門チュートリアル 、オンライン学習へようこそ!

以上がJavaでタスクを定期的に実行する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。