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

淺談Java中spring 線程異步執(zhí)行

 更新時(shí)間:2020年07月23日 10:59:15   作者:yweihainan  
這篇文章主要介紹了淺談spring 線程異步執(zhí)行,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

多線程并發(fā)處理起來(lái)通常比較麻煩,如果你使用spring容器來(lái)管理業(yè)務(wù)bean,事情就好辦了多了。spring封裝了Java的多線程的實(shí)現(xiàn),你只需要關(guān)注于并發(fā)事物的流程以及一些并發(fā)負(fù)載量等特性,具體來(lái)說(shuō)如何使用spring來(lái)處理并發(fā)事務(wù):

1.了解 TaskExecutor接口

Spring的TaskExecutor接口等同于java.util.concurrent.Executor接口。 實(shí)際上,它存在的主要原因是為了在使用線程池的時(shí)候,將對(duì)Java5的依賴(lài)抽象出來(lái)。 這個(gè)接口只有一個(gè)方法execute(Runnable task),它根據(jù)線程池的語(yǔ)義和配置,來(lái)接受一個(gè)執(zhí)行任務(wù)。最初創(chuàng)建TaskExecutor是為了在需要時(shí)給其他Spring組件提供一個(gè)線程池的抽象。 例如ApplicationEventMulticaster組件、JMS的 AbstractMessageListenerContainer和對(duì)Quartz的整合都使用了TaskExecutor抽象來(lái)提供線程池。 當(dāng)然,如果你的bean需要線程池行為,你也可以使用這個(gè)抽象層。

2. TaskExecutor接口的實(shí)現(xiàn)類(lèi)

(1)SimpleAsyncTaskExecutor 類(lèi)

這個(gè)實(shí)現(xiàn)不重用任何線程,或者說(shuō)它每次調(diào)用都啟動(dòng)一個(gè)新線程。但是,它還是支持對(duì)并發(fā)總數(shù)設(shè)限,當(dāng)超過(guò)線程并發(fā)總數(shù)限制時(shí),阻塞新的調(diào)用,直到有位置被釋放。如果你需要真正的池,請(qǐng)繼續(xù)往下看。

(2)SyncTaskExecutor類(lèi)

這個(gè)實(shí)現(xiàn)不會(huì)異步執(zhí)行。相反,每次調(diào)用都在發(fā)起調(diào)用的線程中執(zhí)行。它的主要用處是在不需要多線程的時(shí)候,比如簡(jiǎn)單的test case。

(3)ConcurrentTaskExecutor 類(lèi)

這個(gè)實(shí)現(xiàn)是對(duì)Java 5 java.util.concurrent.Executor類(lèi)的包裝。有另一個(gè)備選, ThreadPoolTaskExecutor類(lèi),它暴露了Executor的配置參數(shù)作為bean屬性。很少需要使用ConcurrentTaskExecutor, 但是如果ThreadPoolTaskExecutor不敷所需,ConcurrentTaskExecutor是另外一個(gè)備選。

(4)SimpleThreadPoolTaskExecutor 類(lèi)

這個(gè)實(shí)現(xiàn)實(shí)際上是Quartz的SimpleThreadPool類(lèi)的子類(lèi),它會(huì)監(jiān)聽(tīng)Spring的生命周期回調(diào)。當(dāng)你有線程池,需要在Quartz和非Quartz組件中共用時(shí),這是它的典型用處。

(5)ThreadPoolTaskExecutor 類(lèi)

它不支持任何對(duì)java.util.concurrent包的替換或者下行移植。Doug Lea和Dawid Kurzyniec對(duì)java.util.concurrent的實(shí)現(xiàn)都采用了不同的包結(jié)構(gòu),導(dǎo)致它們無(wú)法正確運(yùn)行。 這個(gè)實(shí)現(xiàn)只能在Java 5環(huán)境中使用,但是卻是這個(gè)環(huán)境中最常用的。它暴露的bean properties可以用來(lái)配置一個(gè)java.util.concurrent.ThreadPoolExecutor,把它包裝到一個(gè)TaskExecutor中。如果你需要更加先進(jìn)的類(lèi),比如ScheduledThreadPoolExecutor,我們建議你使用ConcurrentTaskExecutor來(lái)替代。

(6)TimerTaskExecutor類(lèi)

這個(gè)實(shí)現(xiàn)使用一個(gè)TimerTask作為其背后的實(shí)現(xiàn)。它和SyncTaskExecutor的不同在于,方法調(diào)用是在一個(gè)獨(dú)立的線程中進(jìn)行的,雖然在那個(gè)線程中是同步的。

(7)WorkManagerTaskExecutor類(lèi)

這個(gè)實(shí)現(xiàn)使用了CommonJ WorkManager作為其底層實(shí)現(xiàn),是在Spring context中配置CommonJ WorkManager應(yīng)用的最重要的類(lèi)。和SimpleThreadPoolTaskExecutor類(lèi)似,這個(gè)類(lèi)實(shí)現(xiàn)了WorkManager接口,因此可以直接作為WorkManager使用。

案例

注冊(cè)TaskExecutor

@Configuration
public class WebMvcConfigurerAdpter extends AbstractWebMvcConfigurerAdpter {

 @Override
 public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
  super.configureMessageConverters(converters);
  WafJsonMapper.getMapper().enable(DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS);
 }


 @Bean
 public TaskExecutor taskExecutor() {
  ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
  executor.setCorePoolSize(5);
  executor.setMaxPoolSize(10);
  return executor;
 }
}

使用:

@Service
public class TaskService {

 @Autowired
 private TaskExecutor executor;

 public void execute() {
  executor.execute(new Runnable() {
   @Override
   public void run() {
    for (int i = 0; i < 10; i++) {
     try {
      Thread.sleep(1000);
      System.out.println("task running ...");
     } catch (Exception e) {

     }
    }
   }
  });
 }
}
@RestController
@RequestMapping(value = "/v0.1")
public class TaskController {

 @Autowired
 private TaskService taskService;

 @RequestMapping()
 public Object execute() {
  taskService.execute();
  Map res = new HashMap();
  res.put("result", "success");
  return res;
 }
}

程序不會(huì)等到10個(gè)線程都跑完才返回結(jié)果,不是阻塞程序,返回結(jié)果后,線程仍然在執(zhí)行。

案例:

ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();
//線程池所使用的緩沖隊(duì)列
poolTaskExecutor.setQueueCapacity(200);
//線程池維護(hù)線程的最少數(shù)量
poolTaskExecutor.setCorePoolSize(5);
//線程池維護(hù)線程的最大數(shù)量
poolTaskExecutor.setMaxPoolSize(1000);
//線程池維護(hù)線程所允許的空閑時(shí)間
poolTaskExecutor.setKeepAliveSeconds(30000);
poolTaskExecutor.initialize();
<!-- 配置線程池 -->
<bean id ="taskExecutor" class ="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" >
 <!-- 線程池維護(hù)線程的最少數(shù)量 -->
<span style="white-space:pre"> </span><property name ="corePoolSize" value ="5" />
 <!-- 線程池維護(hù)線程所允許的空閑時(shí)間 -->
<span style="white-space:pre"> </span><property name ="keepAliveSeconds" value ="30000" />
 <!-- 線程池維護(hù)線程的最大數(shù)量 -->
<span style="white-space:pre"> </span><property name ="maxPoolSize" value ="1000" />
 <!-- 線程池所使用的緩沖隊(duì)列 -->
<span style="white-space:pre"> </span><property name ="queueCapacity" value ="200" />
</bean>
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
ThreadPoolTaskExecutor poolTaskExecutor = (ThreadPoolTaskExecutor)ctx.getBean("taskExecutor");

Thread udpThread = new Thread(udp);
poolTaskExecutor.execute(udpThread);
獲取當(dāng)前線程池活動(dòng)的線程數(shù):
int count = poolTaskExecutor.getActiveCount();
logger.debug("[x] - now threadpool active threads totalNum : " +count);

配置解釋

當(dāng)一個(gè)任務(wù)通過(guò)execute(Runnable)方法欲添加到線程池時(shí):
1、 如果此時(shí)線程池中的數(shù)量小于corePoolSize,即使線程池中的線程都處于空閑狀態(tài),也要?jiǎng)?chuàng)建新的線程來(lái)處理被添加的任務(wù)。
2、 如果此時(shí)線程池中的數(shù)量等于 corePoolSize,但是緩沖隊(duì)列 workQueue未滿,那么任務(wù)被放入緩沖隊(duì)列。
3、如果此時(shí)線程池中的數(shù)量大于corePoolSize,緩沖隊(duì)列workQueue滿,并且線程池中的數(shù)量小于maximumPoolSize,建新的線程來(lái)處理被添加的任務(wù)。
4、 如果此時(shí)線程池中的數(shù)量大于corePoolSize,緩沖隊(duì)列workQueue滿,并且線程池中的數(shù)量等于maximumPoolSize,那么通過(guò) handler所指定的策略來(lái)處理此任務(wù)。也就是:處理任務(wù)的優(yōu)先級(jí)為:核心線程corePoolSize、任務(wù)隊(duì)列workQueue、最大線程 maximumPoolSize,如果三者都滿了,使用handler處理被拒絕的任務(wù)。
5、 當(dāng)線程池中的線程數(shù)量大于 corePoolSize時(shí),如果某線程空閑時(shí)間超過(guò)keepAliveTime,線程將被終止。這樣,線程池可以動(dòng)態(tài)的調(diào)整池中的線程數(shù)。

到此這篇關(guān)于淺談spring 線程異步執(zhí)行的文章就介紹到這了,更多相關(guān)spring 線程異步執(zhí)行內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Boot 初始化運(yùn)行特定方法解析

    Spring Boot 初始化運(yùn)行特定方法解析

    這篇文章主要介紹了Spring Boot 初始化運(yùn)行特定方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Java IO創(chuàng)建目錄和文件實(shí)例代碼

    Java IO創(chuàng)建目錄和文件實(shí)例代碼

    本篇文章給大家分享了Java IO創(chuàng)建目錄和文件的實(shí)例代碼,過(guò)程很簡(jiǎn)單,大家可以測(cè)試參考下。
    2018-02-02
  • Java核心庫(kù)實(shí)現(xiàn)簡(jiǎn)單的AOP

    Java核心庫(kù)實(shí)現(xiàn)簡(jiǎn)單的AOP

    這篇文章主要介紹了如何用Java核心庫(kù)實(shí)現(xiàn)簡(jiǎn)單的AOP,幫助大家為了更好的理解和學(xué)習(xí)AOP的思想,感興趣的朋友可以了解下
    2020-08-08
  • SpringBoot 集成 Jasypt 對(duì)數(shù)據(jù)庫(kù)加密以及踩坑的記錄分享

    SpringBoot 集成 Jasypt 對(duì)數(shù)據(jù)庫(kù)加密以及踩坑的記錄分享

    這篇文章主要介紹了SpringBoot 集成 Jasypt 對(duì)數(shù)據(jù)庫(kù)加密以及踩坑,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Spring數(shù)據(jù)庫(kù)連接池url參數(shù)踩坑及解決

    Spring數(shù)據(jù)庫(kù)連接池url參數(shù)踩坑及解決

    這篇文章主要介紹了Spring數(shù)據(jù)庫(kù)連接池url參數(shù)踩坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • JAVA調(diào)用JavaScript方法舉例詳解

    JAVA調(diào)用JavaScript方法舉例詳解

    之前在一次機(jī)緣巧合的情況下,需要時(shí)用JAVA執(zhí)行js方法,查閱了一些文檔,找到了相關(guān)解決方法,這里和大家分享一下,下面這篇文章主要給大家介紹了關(guān)于JAVA調(diào)用JavaScript方法的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • SpringBoot實(shí)現(xiàn)讀取YML,yaml,properties文件

    SpringBoot實(shí)現(xiàn)讀取YML,yaml,properties文件

    yml,yaml,properties三種文件都是用來(lái)存放配置的文件,一些靜態(tài)數(shù)據(jù),配置的數(shù)據(jù)都會(huì)存放到里邊。本文主要為大家整理了SpringBoot實(shí)現(xiàn)讀取YML,yaml,properties文件的方法,需要的可以參考一下
    2023-04-04
  • 詳解spring cloud config整合gitlab搭建分布式的配置中心

    詳解spring cloud config整合gitlab搭建分布式的配置中心

    這篇文章主要介紹了詳解spring cloud config整合gitlab搭建分布式的配置中心,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • 使用Java實(shí)現(xiàn)文件流轉(zhuǎn)base64

    使用Java實(shí)現(xiàn)文件流轉(zhuǎn)base64

    這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)文件流轉(zhuǎn)base64效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • Java 基礎(chǔ)語(yǔ)法

    Java 基礎(chǔ)語(yǔ)法

    這篇文章主要介紹了Java 基礎(chǔ)語(yǔ)法,Java 是一門(mén)面向?qū)ο蟮慕忉屝途幊陶Z(yǔ)言,面向?qū)ο?意味著我們應(yīng)該把一個(gè) Java 程序看作一系列對(duì)象的集合,我們的工作就是構(gòu)建這些對(duì)象,并通過(guò)調(diào)用彼此的方法來(lái)讓各種對(duì)象協(xié)同工作,解決實(shí)際的問(wèn)題,下面文章內(nèi)容需要的朋友可以參考下一
    2021-11-11

最新評(píng)論

酉阳| 河津市| 社会| 集安市| 台北市| 洛川县| 昭通市| 开封市| 平安县| 仁怀市| 淳安县| 惠州市| 北辰区| 大竹县| 辽宁省| 临沭县| 吉隆县| 博爱县| 新化县| 黄平县| 和田县| 房山区| 连城县| 大邑县| 多伦县| 青冈县| 松江区| 柳河县| 山阴县| 灌云县| 高安市| 新田县| 高州市| 宜州市| 独山县| 陕西省| 璧山县| 巴中市| 肥城市| 静海县| 达日县|