Rumah  >  Artikel  >  Java  >  Cara melaksanakan tugas berjadual dalam persekitaran kendiri Java

Cara melaksanakan tugas berjadual dalam persekitaran kendiri Java

王林
王林ke hadapan
2023-04-18 12:16:031291semak imbas

Rangka Kerja Tugas Bermasa

Cara melaksanakan tugas berjadual dalam persekitaran kendiri Java

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!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam