最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot集成定時器和多線程異步處理操作

 更新時間:2020年09月30日 10:04:04   作者:PascalLee  
這篇文章主要介紹了Springboot集成定時器和多線程異步處理操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

需求:用@schedule標簽進行定時處理邏輯,由于業(yè)務(wù)處理速度慢,需要每次執(zhí)行邏輯放在不同的線程里異步執(zhí)行

springboot集成多線程異步,直接上配置:

/**
 * 線程池異步配置
 */
 
@Configuration
@EnableAsync
public class ThreadExecutorConfig
    implements AsyncConfigurer { 
 
  @Override
  public Executor getAsyncExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    // 設(shè)置核心線程數(shù)
    executor.setCorePoolSize(5);
    // 設(shè)置最大線程數(shù)
    executor.setMaxPoolSize(7);
    // 設(shè)置隊列容量
    executor.setQueueCapacity(20);
    // 設(shè)置線程活躍時間(秒)
    executor.setKeepAliveSeconds(60);
    // 設(shè)置默認線程名稱
    executor.setThreadNamePrefix("PASCAL-");
    // 設(shè)置拒絕策略
    executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
    // 等待所有任務(wù)結(jié)束后再關(guān)閉線程池
    executor.setWaitForTasksToCompleteOnShutdown(true);
    executor.initialize();
    return executor;
  }
 
  @Override
  public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
    return new MyAsyncUncaughtExceptionHandler();
  }
}

下面的是對多線程異步的時候報出的異常處理方法,可以自定義一個處理多線程異常類來實現(xiàn)自身的業(yè)務(wù)邏輯.

import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; 
import java.lang.reflect.Method;
 
public class MyAsyncUncaughtExceptionHandler implements
    AsyncUncaughtExceptionHandler {
  @Override
  public void handleUncaughtException(Throwable ex,
                    Method method, Object... params) { 
      // handle exception
  }
}

啟動類上要記得添加異步和開啟定時器的標簽

@SpringBootApplication
@EnableScheduling
@Async
public class MultithreadingApplication {
 
  public static void main(String[] args) {
    SpringApplication.run(MultithreadingApplication.class, args);
  } 
}

業(yè)務(wù)邏輯方法:

  @Async
  @Scheduled(initialDelay=1000,fixedDelay = 5000)
  public void test(){
    SimpleDateFormat format=new SimpleDateFormat("HH:mm:ss");
    try {
      logger.info("當前線程為:"+Thread.currentThread().getName()+",方法開始時間為:"+format.format(new Date()));
      Thread.sleep(10000);
      logger.info("當前線程為:"+Thread.currentThread().getName()+",方法結(jié)束時間為:"+format.format(new Date()));
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }

對于@Schedule注解的使用方法:

點進去可以看到有幾個可選參數(shù):

fixedDelay:控制方法執(zhí)行的間隔時間,是以上一次方法執(zhí)行完開始算起,如上一次方法執(zhí)行阻塞住了,那么直到上一次執(zhí)行完,并間隔給定的時間后,執(zhí)行下一次

fixedRate:是按照一定的速率執(zhí)行,是從上一次方法執(zhí)行開始的時間算起,如果上一次方法阻塞住了,下一次也是不會執(zhí)行,但是在阻塞這段時間內(nèi)累計應(yīng)該執(zhí)行的次數(shù),當不再阻塞時,一下子把這些全部執(zhí)行掉,而后再按照固定速率繼續(xù)執(zhí)行。

initialDelay:如: @Scheduled(initialDelay = 10000,fixedRate = 15000

這個定時器就是在上一個的基礎(chǔ)上加了一個initialDelay = 10000 意思就是在容器啟動后,延遲10秒后再執(zhí)行一次定時器,以后每15秒再執(zhí)行一次該定時器.

cron表達式可以定制化執(zhí)行任務(wù),但是執(zhí)行的方式是與fixedDelay相近的,也是會按照上一次方法結(jié)束時間開始算起。

這里可以根據(jù)自身的業(yè)務(wù)需求,看到底選擇哪一個更適合,這里cron表達式就不再多言,可以結(jié)合自身應(yīng)用場景來定

這樣,需求就實現(xiàn)了

測試結(jié)果:

20-07-07 11:12:40.436 INFO 32360 --- [      main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8081 (http) with context path ''
2020-07-07 11:12:40.444 INFO 32360 --- [      main] c.e.m.MultithreadingApplication     : Started MultithreadingApplication in 1.223 seconds (JVM running for 1.739)
2020-07-07 11:12:41.445 INFO 32360 --- [  scheduling-1] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService
2020-07-07 11:12:41.452 INFO 32360 --- [    PASCAL-1] c.e.multithreading.service.TestService  : 當前線程為:PASCAL-1,方法開始時間為:11:12:41
2020-07-07 11:12:46.448 INFO 32360 --- [    PASCAL-2] c.e.multithreading.service.TestService  : 當前線程為:PASCAL-2,方法開始時間為:11:12:46
2020-07-07 11:12:51.450 INFO 32360 --- [    PASCAL-3] c.e.multithreading.service.TestService  : 當前線程為:PASCAL-3,方法開始時間為:11:12:51
2020-07-07 11:12:51.453 INFO 32360 --- [    PASCAL-1] c.e.multithreading.service.TestService  : 當前線程為:PASCAL-1,方法結(jié)束時間為:11:12:51
2020-07-07 11:12:56.449 INFO 32360 --- [    PASCAL-2] c.e.multithreading.service.TestService  : 當前線程為:PASCAL-2,方法結(jié)束時間為:11:12:56
2020-07-07 11:12:56.450 INFO 32360 --- [    PASCAL-4] c.e.multithreading.service.TestService  : 當前線程為:PASCAL-4,方法開始時間為:11:12:56
2020-07-07 11:13:01.450 INFO 32360 --- [    PASCAL-3] c.e.multithreading.service.TestService  : 當前線程為:PASCAL-3,方法結(jié)束時間為:11:13:01
2020-07-07 11:13:01.452 INFO 32360 --- [    PASCAL-5] c.e.multithreading.service.TestService  : 當前線程為:PASCAL-5,方法開始時間為:11:13:01
2020-07-07 11:13:06.451 INFO 32360 --- [    PASCAL-4] c.e.multithreading.service.TestService  : 當前線程為:PASCAL-4,方法結(jié)束時間為:11:13:06
2020-07-07 11:13:06.453 INFO 32360 --- [    PASCAL-1] c.e.multithreading.service.TestService  : 當前線程為:PASCAL-1,方法開始時間為:11:13:06
2020-07-07 11:13:11.453 INFO 32360 --- [    PASCAL-5] c.e.multithreading.service.TestService  : 當前線程為:PASCAL-5,方法結(jié)束時間為:11:13:11
2020-07-07 11:13:11.455 INFO 32360 --- [    PASCAL-2] c.e.multithreading.service.TestService  : 當前線程為:PASCAL-2,方法開始時間為:11:13:11
2020-07-07 11:13:16.453 INFO 32360 --- [    PASCAL-1] c.e.multithreading.service.TestService  : 當前線程為:PASCAL-1,方法結(jié)束時間為:11:13:16
2020-07-07 11:13:16.455 INFO 32360 --- [    PASCAL-3] c.e.multithreading.service.TestService  : 當前線程為:PASCAL-3,方法開始時間為:11:13:16
2020-07-07 11:13:21.456 INFO 32360 --- [    PASCAL-2] c.e.multithreading.service.TestService  : 當前線程為:PASCAL-2,方法結(jié)束時間為:11:13:21
2020-07-07 11:13:21.457 INFO 32360 --- [    PASCAL-4] c.e.multithreading.service.TestService  : 當前線程為:PASCAL-4,方法開始時間為:11:13:21
2020-07-07 11:13:26.456 INFO 32360 --- [    PASCAL-3] c.e.multithreading.service.TestService  : 當前線程為:PASCAL-3,方法結(jié)束時間為:11:13:26
2020-07-07 11:13:26.457 INFO 32360 --- [    PASCAL-5] c.e.multithreading.service.TestService  : 當前線程為:PASCAL-5,方法開始時間為:11:13:26
2020-07-07 11:13:31.458 INFO 32360 --- [    PASCAL-4] c.e.multithreading.service.TestService  : 當前線程為:PASCAL-4,方法結(jié)束時間為:11:13:31
2020-07-07 11:13:31.459 INFO 32360 --- [    PASCAL-1] c.e.multithreading.service.TestService  : 當前線程為:PASCAL-1,方法開始時間為:11:13:31
2020-07-07 11:13:36.458 INFO 32360 --- [    PASCAL-5] c.e.multithreading.service.TestService  : 當前線程為:PASCAL-5,方法結(jié)束時間為:11:13:36
2020-07-07 11:13:36.460 INFO 32360 --- [    PASCAL-2] c.e.multithreading.service.TestService  : 當前線程為:PASCAL-2,方法開始時間為:11:13:36
2020-07-07 11:13:41.459 INFO 32360 --- [    PASCAL-1] c.e.multithreading.service.TestService  : 當前線程為:PASCAL-1,方法結(jié)束時間為:11:13:41
2020-07-07 11:13:41.462 INFO 32360 --- [    PASCAL-3] c.e.multithreading.service.TestService  : 當前線程為:PASCAL-3,方法開始時間為:11:13:41
2020-07-07 11:13:46.461 INFO 32360 --- [    PASCAL-2] c.e.multithreading.service.TestService  : 當前線程為:PASCAL-2,方法結(jié)束時間為:11:13:46

每隔五秒執(zhí)行一次

-----------------------分割線-----------------------

如果有多個定時任務(wù),每個任務(wù)需要在不同的線程間處理的話,就要用另外的配置:如下:

/**
 * 配置多個schedule的線程配置
 */
@Configuration
@EnableScheduling
public class ScheduleConfig implements SchedulingConfigurer{
  /*
   * 并行任務(wù)
   */
  public void configureTasks(ScheduledTaskRegistrar taskRegistrar)
  {
    ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
    taskScheduler.setThreadNamePrefix("Schedule-Task-");
    taskScheduler.setPoolSize(5);
    taskScheduler.setAwaitTerminationSeconds(60);
    taskScheduler.setWaitForTasksToCompleteOnShutdown(true);
    taskScheduler.initialize();
    taskRegistrar.setTaskScheduler(taskScheduler);
  }
}

業(yè)務(wù)如下:

  @Scheduled(cron = "*/5 * * * * ?")
  public void test1(){
    SimpleDateFormat format=new SimpleDateFormat("HH:mm:ss");
    try {
      logger.info("當前線程為:"+Thread.currentThread().getName()+",方法開始時間為:"+format.format(new Date()));
      Thread.sleep(10000);
      logger.info("當前線程為:"+Thread.currentThread().getName()+",方法結(jié)束時間為:"+format.format(new Date()));
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }
 
  @Scheduled(cron = "*/5 * * * * ?")
  public void test2(){
    SimpleDateFormat format=new SimpleDateFormat("HH:mm:ss");
    try {
      logger.info("當前線程為:"+Thread.currentThread().getName()+",方法開始時間為:"+format.format(new Date()));
      Thread.sleep(10000);
      logger.info("當前線程為:"+Thread.currentThread().getName()+",方法結(jié)束時間為:"+format.format(new Date()));
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
  }

測試結(jié)果:

2020-07-07 11:34:53.101 INFO 27440 --- [      main] c.e.m.MultithreadingApplication     : Started MultithreadingApplication in 1.147 seconds (JVM running for 1.74)
2020-07-07 11:34:55.002 INFO 27440 --- [Schedule-Task-2] c.e.multithreading.service.TestService  : 當前線程為:Schedule-Task-2,方法開始時間為:11:34:55
2020-07-07 11:34:55.002 INFO 27440 --- [Schedule-Task-1] c.e.multithreading.service.TestService  : 當前線程為:Schedule-Task-1,方法開始時間為:11:34:55
2020-07-07 11:35:05.003 INFO 27440 --- [Schedule-Task-2] c.e.multithreading.service.TestService  : 當前線程為:Schedule-Task-2,方法結(jié)束時間為:11:35:05
2020-07-07 11:35:05.003 INFO 27440 --- [Schedule-Task-1] c.e.multithreading.service.TestService  : 當前線程為:Schedule-Task-1,方法結(jié)束時間為:11:35:05
2020-07-07 11:35:10.001 INFO 27440 --- [Schedule-Task-2] c.e.multithreading.service.TestService  : 當前線程為:Schedule-Task-2,方法開始時間為:11:35:10
2020-07-07 11:35:10.001 INFO 27440 --- [Schedule-Task-1] c.e.multithreading.service.TestService  : 當前線程為:Schedule-Task-1,方法開始時間為:11:35:10
2020-07-07 11:35:20.001 INFO 27440 --- [Schedule-Task-2] c.e.multithreading.service.TestService  : 當前線程為:Schedule-Task-2,方法結(jié)束時間為:11:35:20
2020-07-07 11:35:20.002 INFO 27440 --- [Schedule-Task-1] c.e.multithreading.service.TestService  : 當前線程為:Schedule-Task-1,方法結(jié)束時間為:11:35:20
2020-07-07 11:35:25.001 INFO 27440 --- [Schedule-Task-1] c.e.multithreading.service.TestService  : 當前線程為:Schedule-Task-1,方法開始時間為:11:35:25
2020-07-07 11:35:25.003 INFO 27440 --- [Schedule-Task-3] c.e.multithreading.service.TestService  : 當前線程為:Schedule-Task-3,方法開始時間為:11:35:25
2020-07-07 11:35:35.001 INFO 27440 --- [Schedule-Task-1] c.e.multithreading.service.TestService  : 當前線程為:Schedule-Task-1,方法結(jié)束時間為:11:35:35
2020-07-07 11:35:35.003 INFO 27440 --- [Schedule-Task-3] c.e.multithreading.service.TestService  : 當前線程為:Schedule-Task-3,方法結(jié)束時間為:11:35:35
2020-07-07 11:35:40.002 INFO 27440 --- [Schedule-Task-1] c.e.multithreading.service.TestService  : 當前線程為:Schedule-Task-1,方法開始時間為:11:35:40
2020-07-07 11:35:40.002 INFO 27440 --- [Schedule-Task-5] c.e.multithreading.service.TestService  : 當前線程為:Schedule-Task-5,方法開始時間為:11:35:40
2020-07-07 11:35:50.002 INFO 27440 --- [Schedule-Task-1] c.e.multithreading.service.TestService  : 當前線程為:Schedule-Task-1,方法結(jié)束時間為:11:35:50
2020-07-07 11:35:50.002 INFO 27440 --- [Schedule-Task-5] c.e.multithreading.service.TestService  : 當前線程為:Schedule-Task-5,方法結(jié)束時間為:11:35:50

以上這篇Springboot集成定時器和多線程異步處理操作就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java詳解多線程協(xié)作作業(yè)之信號同步

    Java詳解多線程協(xié)作作業(yè)之信號同步

    信號量同步是指在不同線程之間,通過傳遞同步信號量來協(xié)調(diào)線程執(zhí)行的先后次序。CountDownLatch是基于時間維度的Semaphore則是基于信號維度的
    2022-05-05
  • 如何使用IntelliJ IDEA中的Live Templates自定義代碼模板

    如何使用IntelliJ IDEA中的Live Templates自定義代碼模板

    在IntelliJ IDEA中,通過使用LiveTemplates功能,可以實現(xiàn)快速編碼和自定義代碼模板,例如,輸入“main”可以自動補全主函數(shù)結(jié)構(gòu),“sout”可以補全輸出語句,用戶可以通過設(shè)置中的LiveTemplates選項查看和定義快捷模板,支持使用分組管理和參數(shù)化模板內(nèi)容,適應(yīng)復(fù)雜的編碼需求
    2024-11-11
  • 基于logback.xml不生效問題的解決

    基于logback.xml不生效問題的解決

    這篇文章主要介紹了基于logback.xml不生效問題的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Java迭代器遍歷list的方法及代碼分析

    Java迭代器遍歷list的方法及代碼分析

    在本篇內(nèi)容里系小編給大家分享的是一篇關(guān)于Java迭代器遍歷list的方法總結(jié)內(nèi)容,有需要的朋友們可以參考學習下。
    2022-11-11
  • RocketMQ?Broker實現(xiàn)高可用高并發(fā)的消息中轉(zhuǎn)服務(wù)

    RocketMQ?Broker實現(xiàn)高可用高并發(fā)的消息中轉(zhuǎn)服務(wù)

    RocketMQ消息代理(Broker)是一種高可用、高并發(fā)的消息中轉(zhuǎn)服務(wù),能夠接收并存儲生產(chǎn)者發(fā)送的消息,并將消息發(fā)送給消費者。它具有多種消息存儲模式和消息傳遞模式,支持水平擴展和故障轉(zhuǎn)移等特性,可以為分布式應(yīng)用提供可靠的消息傳遞服務(wù)
    2023-04-04
  • springboot swagger2注解使用的教程

    springboot swagger2注解使用的教程

    這篇文章主要介紹了springboot swagger2注解使用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • java Long==Long有趣的現(xiàn)象詳解

    java Long==Long有趣的現(xiàn)象詳解

    這篇文章主要給大家介紹了關(guān)于java Long==Long有趣的現(xiàn)象的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-09-09
  • Springboot集成規(guī)則引擎Drools方式

    Springboot集成規(guī)則引擎Drools方式

    這篇文章主要介紹了Springboot集成規(guī)則引擎Drools方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 最新評論

    巴彦县| 特克斯县| 宁河县| 武汉市| 彰化市| 文水县| 彰武县| 昌黎县| 大石桥市| 大冶市| 信宜市| 临沧市| 蓬溪县| 横峰县| 盖州市| 谢通门县| 建阳市| 天祝| 江口县| 武城县| 元氏县| 富顺县| 洪洞县| 富源县| 靖宇县| 临沧市| 静乐县| 阜康市| 沛县| 富民县| 佳木斯市| 兰州市| 满洲里市| 石首市| 安多县| 搜索| 资溪县| 砚山县| 天台县| 高台县| 河西区|