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 サイトの他の関連記事を参照してください。