Cara melaksanakan tugas berjadual dalam persekitaran kendiri Java
Rangka Kerja Tugas Bermasa
TimeTask
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
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.
Tugas Musim Bunga
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!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Panduan Nombor Sempurna di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor Perfect dalam Java?, contoh dengan pelaksanaan kod.

Panduan untuk Penjana Nombor Rawak di Jawa. Di sini kita membincangkan Fungsi dalam Java dengan contoh dan dua Penjana berbeza dengan contoh lain.

Panduan untuk Weka di Jawa. Di sini kita membincangkan Pengenalan, cara menggunakan weka java, jenis platform, dan kelebihan dengan contoh.

Panduan untuk Nombor Smith di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor smith di Jawa? contoh dengan pelaksanaan kod.

Dalam artikel ini, kami telah menyimpan Soalan Temuduga Spring Java yang paling banyak ditanya dengan jawapan terperinci mereka. Supaya anda boleh memecahkan temuduga.

Java 8 memperkenalkan API Stream, menyediakan cara yang kuat dan ekspresif untuk memproses koleksi data. Walau bagaimanapun, soalan biasa apabila menggunakan aliran adalah: bagaimana untuk memecahkan atau kembali dari operasi foreach? Gelung tradisional membolehkan gangguan awal atau pulangan, tetapi kaedah Foreach Stream tidak menyokong secara langsung kaedah ini. Artikel ini akan menerangkan sebab -sebab dan meneroka kaedah alternatif untuk melaksanakan penamatan pramatang dalam sistem pemprosesan aliran. Bacaan Lanjut: Penambahbaikan API Java Stream Memahami aliran aliran Kaedah Foreach adalah operasi terminal yang melakukan satu operasi pada setiap elemen dalam aliran. Niat reka bentuknya adalah

Panduan untuk TimeStamp to Date di Java. Di sini kita juga membincangkan pengenalan dan cara menukar cap waktu kepada tarikh dalam java bersama-sama dengan contoh.

Kapsul adalah angka geometri tiga dimensi, terdiri daripada silinder dan hemisfera di kedua-dua hujungnya. Jumlah kapsul boleh dikira dengan menambahkan isipadu silinder dan jumlah hemisfera di kedua -dua hujungnya. Tutorial ini akan membincangkan cara mengira jumlah kapsul yang diberikan dalam Java menggunakan kaedah yang berbeza. Formula volum kapsul Formula untuk jumlah kapsul adalah seperti berikut: Kelantangan kapsul = isipadu isipadu silinder Dua jumlah hemisfera dalam, R: Radius hemisfera. H: Ketinggian silinder (tidak termasuk hemisfera). Contoh 1 masukkan Jejari = 5 unit Ketinggian = 10 unit Output Jilid = 1570.8 Unit padu menjelaskan Kirakan kelantangan menggunakan formula: Kelantangan = π × r2 × h (4
