欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

1.了解 TaskExecutor接口

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

2. TaskExecutor接口的實現(xiàn)類

(1)SimpleAsyncTaskExecutor 類

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

(2)SyncTaskExecutor類

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

(3)ConcurrentTaskExecutor 類

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

(4)SimpleThreadPoolTaskExecutor 類

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

(5)ThreadPoolTaskExecutor 類

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

(6)TimerTaskExecutor類

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

(7)WorkManagerTaskExecutor類

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

案例

注冊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;
 }
}

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

案例:

ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();
//線程池所使用的緩沖隊列
poolTaskExecutor.setQueueCapacity(200);
//線程池維護線程的最少數(shù)量
poolTaskExecutor.setCorePoolSize(5);
//線程池維護線程的最大數(shù)量
poolTaskExecutor.setMaxPoolSize(1000);
//線程池維護線程所允許的空閑時間
poolTaskExecutor.setKeepAliveSeconds(30000);
poolTaskExecutor.initialize();
<!-- 配置線程池 -->
<bean id ="taskExecutor" class ="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" >
 <!-- 線程池維護線程的最少數(shù)量 -->
<span style="white-space:pre"> </span><property name ="corePoolSize" value ="5" />
 <!-- 線程池維護線程所允許的空閑時間 -->
<span style="white-space:pre"> </span><property name ="keepAliveSeconds" value ="30000" />
 <!-- 線程池維護線程的最大數(shù)量 -->
<span style="white-space:pre"> </span><property name ="maxPoolSize" value ="1000" />
 <!-- 線程池所使用的緩沖隊列 -->
<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);
獲取當前線程池活動的線程數(shù):
int count = poolTaskExecutor.getActiveCount();
logger.debug("[x] - now threadpool active threads totalNum : " +count);

配置解釋

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

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

相關文章

  • springboot 如何配置多個jndi數(shù)據(jù)源

    springboot 如何配置多個jndi數(shù)據(jù)源

    這篇文章主要介紹了springboot 如何配置多個jndi數(shù)據(jù)源的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java多線程面試題之交替輸出問題的實現(xiàn)

    Java多線程面試題之交替輸出問題的實現(xiàn)

    本文主要介紹了Java多線程面試題之交替輸出問題的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • WebService的相關概念

    WebService的相關概念

    這篇文章主要介紹了WebService的相關概念的相關資料,需要的朋友可以參考下
    2017-10-10
  • 如何使用JAVA實現(xiàn)數(shù)字水印

    如何使用JAVA實現(xiàn)數(shù)字水印

    本文介紹了如何使用JAVA實現(xiàn)數(shù)字水印,主要用到了java.awt包中的AlphaComposite類,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2015-07-07
  • Spring?Boot中WebMvcConfig配置詳解及示例代碼

    Spring?Boot中WebMvcConfig配置詳解及示例代碼

    WebMvcConfig是一個配置類,它繼承了WebMvcConfigurationSupport,允許我們對SpringMVC進行更細粒度的控制,這篇文章主要給大家介紹了關于Spring?Boot中WebMvcConfig配置詳解及示例的相關資料,需要的朋友可以參考下
    2024-03-03
  • java 判斷字符串是否包含子串的方法

    java 判斷字符串是否包含子串的方法

    這篇文章主要介紹了java 判斷字符串是否包含子串的方法的相關資料,這里提供了三種方法幫助大家實現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-08-08
  • 詳解spring mvc對異步請求的處理

    詳解spring mvc對異步請求的處理

    spring mvc3.2及以上版本增加了對請求的異步處理,是在servlet3的基礎上進行封裝的,有興趣的可以了解一下。
    2017-01-01
  • springboot 使用ThreadLocal的實例代碼

    springboot 使用ThreadLocal的實例代碼

    這篇文章主要介紹了springboot 使用ThreadLocal的實例代碼,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java遍歷Properties所有元素的方法實例

    Java遍歷Properties所有元素的方法實例

    這篇文章主要介紹了Java如何遍歷Properties所有元素的方法,大家可以參考使用
    2013-11-11
  • SpringBoot實現(xiàn)阿里云短信發(fā)送的示例代碼

    SpringBoot實現(xiàn)阿里云短信發(fā)送的示例代碼

    這篇文章主要為大家介紹了如何利用SpringBoot實現(xiàn)阿里云短信發(fā)送,文中的示例代碼講解詳細,對我們學習或工作有一定幫助,需要的可以參考一下
    2022-04-04

最新評論