Rumah >Java >javaTutorial >Cara melaksanakan tugas berjadual dalam persekitaran kendiri Java
Dari masa kami mula mempelajari Java, TimeTask mula-mula digunakan untuk melaksanakan tugas berjadual dan Pemasa digunakan secara dalaman Kelas TaskQueue menyimpan tugas berjadual Ia adalah baris gilir keutamaan yang dilaksanakan berdasarkan timbunan minimum. TaskQueue akan mengisih tugas mengikut jarak antara tugas dan masa pelaksanaan seterusnya, memastikan tugasan di bahagian atas timbunan dilaksanakan terlebih dahulu.
Contoh kod:
public static void main(String[] args) { TimerTask task = new TimerTask() { public void run() { System.out.println("当前时间: " + new Date() + "n" + "线程名称: " + Thread.currentThread().getName()); } }; Timer timer = new Timer("Timer"); long delay = 5000L; timer.schedule(task, delay); System.out.println("当前时间: " + new Date() + "n" + "线程名称: " + Thread.currentThread().getName()); }
Hasil berjalan:
当前时间: Wed Apr 06 22:05:04 CST 2022n线程名称: main 当前时间: Wed Apr 06 22:05:09 CST 2022n线程名称: Timer
Seperti yang dapat dilihat daripada keputusan, tugas yang dijadualkan telah dilaksanakan selepas 5 saat.
Kelemahan:
Tugas pelaksanaan TimeTask hanya boleh dilaksanakan secara bersiri Setelah satu tugasan mengambil masa yang lama untuk dilaksanakan, ia akan menjejaskan pelaksanaan daripada tugasan lain
Jika pengecualian berlaku semasa pelaksanaan tugas, tugasan akan berhenti terus.
Seiring dengan berlalunya masa, teknologi java sentiasa dikemas kini Sebagai tindak balas kepada kekurangan TimeTask, ScheduledExecutorService muncul untuk menggantikan TimeTask.
ScheduledExecutorService ialah antara muka dengan berbilang kelas pelaksanaan, yang lebih biasa digunakan ialah ScheduledThreadPoolExecutor. ScheduledThreadPoolExecutor sendiri ialah kumpulan benang, yang menggunakan DelayQueue secara dalaman sebagai baris gilir tugas dan menyokong pelaksanaan tugasan serentak.
Contoh kod:
public static void main(String[] args) throws InterruptedException { ScheduledExecutorService executorService = Executors.newScheduledThreadPool(3); // 执行任务: 每 10秒执行一次 executorService.scheduleAtFixedRate(() -> { System.out.println("执行任务:" + new Date()+",线程名称: " + Thread.currentThread().getName()); }, 1, 10, TimeUnit.SECONDS); }
Kelemahan:
Cuba elakkan menggunakan Executors Create kumpulan benang, kerana baris gilir yang digunakan secara dalaman dalam kumpulan benang jdk sendiri adalah agak besar, dan OOM terdedah untuk berlaku.
Tugas berjadual adalah berdasarkan memori kendiri JVM Sebaik sahaja tugas yang dijadualkan dimulakan semula, tugas itu akan hilang.
tidak boleh menyokong ungkapan cron untuk melaksanakan tugas berjadual yang kaya.
Selepas mempelajari Spring, saya mula menggunakan Task Spring sendiri. Rangka Kerja Spring disertakan dengan tugas berjadual dan menyediakan ekspresi cron untuk melaksanakan konfigurasi tugas berjadual yang kaya.
Kod contoh:
@EnableScheduling @Component public class SpringTask { private Logger logger = LoggerFactory.getLogger(SpringTask.class); private static final SimpleDateFormat dateFormat = new SimpleDateFormat( "HH:mm:ss"); /** * fixedRate:固定速率执行。每5秒执行一次。 */ @Scheduled(fixedRate = 5000) public void invokeTaskWithFixedRate() { logger.info("Fixed Rate Task : Current Time is {}", dateFormat.format(new Date())); } /** * fixedDelay:固定延迟执行。距离上一次调用成功后2秒才执。 */ @Scheduled(fixedDelay = 2000) public void invokeTaskWithFixedDelay() { try { TimeUnit.SECONDS.sleep(3); logger.info("Fixed Delay Task : Current Time is {}", dateFormat.format(new Date())); } catch (InterruptedException e) { logger.error("invoke task error",e); } } /** * initialDelay:初始延迟。任务的第一次执行将延迟5秒,然后将以5秒的固定间隔执行。 */ @Scheduled(initialDelay = 5000, fixedRate = 5000) public void invokeTaskWithInitialDelay() { logger.info("Task with Initial Delay : Current Time is {}", dateFormat.format(new Date())); } /** * cron:使用Cron表达式,每隔5秒执行一次 */ @Scheduled(cron = "0/5 * * * * ? ") public void invokeTaskWithCronExpression() { logger.info("Task Cron Expression: Current Time is {}", dateFormat.format(new Date())); } }
Hasil pelaksanaan:
2022-04-06 23:06 :20.945 INFO 14604 --- [ penjadualan-1] com.fw.task.SpringTask : Ungkapan Cron Tugasan: Masa Semasa ialah 23:06:20
2022-04-06 23:06:22.557 INFO 14604 -- [ penjadualan-1] com.fw.task.SpringTask : Tugasan dengan Kelewatan Awal : Masa Semasa ialah 23:06:22
2022-04-06 23:06:22.557 INFO 14604 --- [ penjadualan-1] com .fw.task.SpringTask : Tugasan Kadar Tetap : Masa Semasa ialah 23:06:22
2022-04-06 23:06:25.955 INFO 14604 --- [ penjadualan-1] com.fw.task.SpringTask : : Tugasan Kelewatan Tetap : Masa Semasa ialah 23:06:25
2022-04-06 23:06:25.955 INFO 14604 --- [ penjadualan-1] com.fw.task.SpringTask : Ungkapan Cron Tugas: Masa Semasa ialah 23:06:25
2022-04-06 23:06:27.555 INFO 14604 --- [ penjadualan-1] com.fw.task.SpringTask : Tugasan dengan Kelewatan Awal : Masa Semasa ialah 23:06:27
2022-04-06 23:06:27.556 INFO 14604 --- [ penjadualan-1] com.fw.task.SpringTask : Tugasan Kadar Tetap : Masa Semasa ialah 23:06:27
@EnableScheduling perlu mendayakan tugas berjadual, @Scheduled(cron = "0/5 * * * * ?") mengkonfigurasi peraturan untuk tugas berjadual. Ungkapan cron menyokong konfigurasi tugas berjadual yang kaya Mereka yang tidak biasa dengannya boleh menyemak
Kelebihan:
Ia mudah dan mudah digunakan serta menyokong pelbagai kompleks. konfigurasi tugas berjadual
Kelemahan:
Berdasarkan tugasan berjadual yang berdiri sendiri, tugas yang dijadualkan akan hilang setelah dimulakan semula.
Tugas berjadual ialah tugas berbenang tunggal secara lalai Jika pelaksanaan selari diperlukan, @EnableAsync mesti didayakan.
Tiada pengurusan penjadualan tugas grafik bersatu dan tugas berjadual tidak boleh dikawal
Atas ialah kandungan terperinci Cara melaksanakan tugas berjadual dalam persekitaran kendiri Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!