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

Spring 與 JDK 線程池的簡(jiǎn)單使用示例詳解

 更新時(shí)間:2022年09月10日 09:17:20   作者:羈客%  
這篇文章主要介紹了Spring 與 JDK 線程池的簡(jiǎn)單使用,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

1.配置自定義共享線程池(Spring線程池)

@Configuration
@EnableAsync
public class ThreadPoolConfig{
 
  //主要任務(wù)的調(diào)度,計(jì)劃執(zhí)行
  @Bean("taskScheduler")
  public Executor createScheduler(){
	    // 創(chuàng)建一個(gè)線程池對(duì)象
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        // 定義一個(gè)線程池大小
        scheduler.setPoolSize(100);
        // 線程池名的前綴
        scheduler.setThreadNamePrefix("taskScheduler-");
        // 設(shè)置線程池關(guān)閉的時(shí)候等待所有任務(wù)都完成再繼續(xù)銷毀其他的Bean
        scheduler.setWaitForTasksToCompleteOnShutdown(true);
        // 設(shè)置線程池中任務(wù)的等待時(shí)間,如果超過(guò)這個(gè)時(shí)候還沒(méi)有銷毀就強(qiáng)制銷毀,以確保應(yīng)用最后能夠被關(guān)閉,而不是阻塞住
        scheduler.setAwaitTerminationSeconds(60);
        // 線程池對(duì)拒絕任務(wù)的處理策略,當(dāng)線程池沒(méi)有處理能力的時(shí)候,該策略會(huì)直接在 execute 方法的調(diào)用線程中運(yùn)行被拒絕的任務(wù);如果執(zhí)行程序已關(guān)閉,則會(huì)丟棄該任務(wù)
        scheduler.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
	    return scheduler;
  }

  //主要任務(wù)的執(zhí)行
  @Bean("taskExecutor")
  public Executor createExecutor(){
	    // 創(chuàng)建一個(gè)線程池對(duì)象
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
         //核心線程池大小
        executor.setCorePoolSize(10);
        //最大線程數(shù)
        executor.setMaxPoolSize(30);
        //隊(duì)列容量
        executor.setQueueCapacity(100);
        //活躍時(shí)間
        executor.setKeepAliveSeconds(60);
        //線程名字前綴
        executor.setThreadNamePrefix("taskExecutor-");
        // 設(shè)置線程池關(guān)閉的時(shí)候等待所有任務(wù)都完成再繼續(xù)銷毀其他的Bean
        executor.setWaitForTasksToCompleteOnShutdown(true);
        // 線程池對(duì)拒絕任務(wù)的處理策略,當(dāng)線程池沒(méi)有處理能力的時(shí)候,該策略會(huì)直接在 execute 方法的調(diào)用線程中運(yùn)行被拒絕的任務(wù);如果執(zhí)行程序已關(guān)閉,則會(huì)丟棄該任務(wù)
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        return executor;
  }

}

2.編寫執(zhí)行任務(wù)對(duì)象與具體任務(wù)邏輯方法

@Component
public class TaskComponent{
  @Async("taskExecutor")
  public void doTaskExecutor() {
	System.out.println("任務(wù)開(kāi)始執(zhí)行!?。?);
  	//具體的執(zhí)行任務(wù)
	//。。。。。。。
  }

//  //有返回值(ObjectVo為自己定義的返回類型)
//@Async("taskExecutor")
//public Future<ObjectVo> doTaskExecutor() {
//	System.out.println("任務(wù)開(kāi)始執(zhí)行?。?!");
//  	//具體的執(zhí)行任務(wù)
//	//。。。。。。。
//	ObjectVo result=new ObjectVo();
//	return new AsyncResult<>(result);
//}
  @Async("taskScheduler")
  public void doTaskScheduler() {
	System.out.println("任務(wù)開(kāi)始調(diào)度?。?!");
  	//具體的調(diào)度任務(wù)
	//。。。。。。。
  }

//  //有返回值(ObjectVo為自己定義的返回類型)
//@Async("taskScheduler")
//public Future<ObjectVo> doTaskScheduler() {
//	System.out.println("任務(wù)開(kāi)始調(diào)度!??!");
//  	//具體的調(diào)度任務(wù)
//	//。。。。。。。
//	ObjectVo result=new ObjectVo();
//	return new AsyncResult<>(result);
//}
}

3.調(diào)用任務(wù)方法(在哪調(diào)用都可以,根據(jù)自己業(yè)務(wù)需求在合適的地方調(diào)用即可)

@Service
public class UserServiceImpl implements UserService{
  @Autowired
  private TaskComponent taskComponent;
  //測(cè)試任務(wù)執(zhí)行與調(diào)用
  @SneakyThrows
  @Override
  public void testTask(){
	//沒(méi)有返回值
	taskComponent.doTaskExecutor();
	taskComponent.doTaskScheduler();

	//有返回值
	//Future<ObjectVo> executorResult = taskComponent.doTaskExecutor();
	//Future<ObjectVo> schedulerResult = taskComponent.doTaskScheduler();
	//System.out.println(executorResult.get());
	//System.out.println(schedulerResult.get());
  }
}

===============Executors結(jié)構(gòu)========jdk自帶線程池==========

1.任務(wù)(Runnable,Callable)

2.任務(wù)的執(zhí)行(Executor,ExecutorService 接口,ThreadPoolExecutor,ScheduledThreadExecutor實(shí)現(xiàn)類)

3.計(jì)算結(jié)果(返回結(jié)果 Future接口,F(xiàn)utureTask實(shí)現(xiàn)類)

===============Executors現(xiàn)成的線程池========jdk自帶線程池====

1 Executors.FixedThreadPool 核心數(shù)=容納的最大線程數(shù)=N

無(wú)界隊(duì)列(當(dāng)隊(duì)列過(guò)多時(shí),會(huì)造成無(wú)限循環(huán))

2 Executors.CachedThreadPool 容納的最大線程數(shù)=無(wú)界  

主線程提交任務(wù)的速度高于 maximumPoolSize中線程處理任務(wù)的速度時(shí) CachedThreadPool將會(huì)不斷的創(chuàng)建新的線程,

在極端情況下, 

CachedThreadPool會(huì)因?yàn)閯?chuàng)建過(guò)多線程而耗盡CPU和內(nèi)存資源

3 Executors.SingleThreadExecutor 核心數(shù)=容納的最大線程數(shù)=1 始終保持只有一個(gè)線程在執(zhí)行 

無(wú)界隊(duì)列(當(dāng)隊(duì)列過(guò)多時(shí),會(huì)造成無(wú)限循環(huán))

===============自定義Executors===========jdk自帶線程池====================

ExecuteService threadPool = new ThreadPoolExecutor(int corePoolSize,
                int maximumPoolSize,
                long keepAliveTime,
                TimeUnit unit,
                BlockingQueue<Runnable> workQueue,
                ThreadFactory threadFactory,
                RejectedExecutionHandler handler);

//設(shè)置線程池的前綴

ThreadFactory threadFactory = new ThreadFactoryBuilder()

.setNameFormat("trhead-pool-%d").build();

//設(shè)置決絕策略

RejectedExecutionHandler: 

AbortPolicy:拋出RejectedExecutionException

CallerRunsPolicy:直接在execute方法的調(diào)用線程中運(yùn)行被拒絕的任務(wù)。

DiscardOldestPolicy:放棄最舊的未處理請(qǐng)求,重試execute。

DiscardPolicy:丟棄被拒絕的任務(wù)。

================處理流程===================jdk 與 spring =====================

1.核心線程池是否在執(zhí)行任務(wù),不在執(zhí)行就選一條線程執(zhí)行,否則查看核心線程池是否已滿

2.核心線程池是否滿,不滿則創(chuàng)建一條線程執(zhí)行,否值查看隊(duì)列是否已滿

3.隊(duì)列是否滿,隊(duì)列不滿加入隊(duì)列,否則查看線程池是否已滿

4.線程池是否已滿,線程池不滿創(chuàng)建一條線程池,否則根據(jù)決絕策略處理

# 1.當(dāng)一個(gè)任務(wù)被提交到線程池時(shí),首先查看線程池的核心線程是否都在執(zhí)行任務(wù),否就選擇一條線程執(zhí)行任務(wù),是就執(zhí)行第二步。

# 2.查看核心線程池是否已滿,不滿就創(chuàng)建一條線程執(zhí)行任務(wù),否則執(zhí)行第三步。

# 3.查看任務(wù)隊(duì)列是否已滿,不滿就將任務(wù)存儲(chǔ)在任務(wù)隊(duì)列中,否則執(zhí)行第四步。

# 4.查看線程池是否已滿,不滿就創(chuàng)建一條線程執(zhí)行任務(wù),否則就按照策略(拒絕策略)處理無(wú)法執(zhí)行的任務(wù)。

到此這篇關(guān)于Spring 與 JDK 線程池的簡(jiǎn)單使用的文章就介紹到這了,更多相關(guān)Spring 與 JDK 線程池內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java如何獲取yml配置文件工具類

    java如何獲取yml配置文件工具類

    本文介紹了java獲取yml配置文件的工具類引入pom文件的方法,首先,創(chuàng)建一個(gè)與工具類同名的類,然后將工具類的代碼復(fù)制到新創(chuàng)建的類中,運(yùn)行后輸出:0*/1***?完成操作,此方法簡(jiǎn)單易行,適合初學(xué)者使用
    2024-10-10
  • Springboot基礎(chǔ)學(xué)習(xí)之初識(shí)SpringBoot

    Springboot基礎(chǔ)學(xué)習(xí)之初識(shí)SpringBoot

    今天帶大家學(xué)習(xí)Springboot基礎(chǔ)知識(shí),文中有非常詳細(xì)的圖文解說(shuō)及代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們很有幫助,需要的朋友可以參考下
    2021-05-05
  • java 通過(guò)cmd 調(diào)用命令啟動(dòng)tomcat的操作

    java 通過(guò)cmd 調(diào)用命令啟動(dòng)tomcat的操作

    這篇文章主要介紹了java 通過(guò)cmd 調(diào)用命令啟動(dòng)tomcat的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • 詳解分別用Kotlin和java寫RecyclerView的示例

    詳解分別用Kotlin和java寫RecyclerView的示例

    本篇文章主要介紹了詳解分別用Kotlin和java寫RecyclerView的示例,詳解分別用Kotlin和java寫RecyclerView的示例
    2017-12-12
  • SpringBoot整合Shiro兩種方式(總結(jié))

    SpringBoot整合Shiro兩種方式(總結(jié))

    這篇文章主要介紹了SpringBoot整合Shiro兩種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • java從文件中讀取數(shù)據(jù)的六種方法

    java從文件中讀取數(shù)據(jù)的六種方法

    本文主要介紹了java從文件中讀取數(shù)據(jù)的方法,詳細(xì)的介紹了六種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • IDEA自帶Maven插件找不到settings.xml配置文件

    IDEA自帶Maven插件找不到settings.xml配置文件

    IDEA自帶了Maven插件,最近發(fā)現(xiàn)了一個(gè)問(wèn)題,IDEA自帶Maven插件找不到settings.xml配置文件,本文就來(lái)詳細(xì)的介紹一下解決方法,感興趣的可以了解一下
    2023-11-11
  • ServletWebServerApplicationContext創(chuàng)建Web容器Tomcat示例

    ServletWebServerApplicationContext創(chuàng)建Web容器Tomcat示例

    這篇文章主要為大家介紹了ServletWebServerApplicationContext創(chuàng)建Web容器Tomcat示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • springboot創(chuàng)建多module項(xiàng)目的實(shí)例

    springboot創(chuàng)建多module項(xiàng)目的實(shí)例

    這篇文章主要介紹了springboot創(chuàng)建多module項(xiàng)目的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 詳解SpringBoot開(kāi)發(fā)案例之整合Dubbo分布式服務(wù)

    詳解SpringBoot開(kāi)發(fā)案例之整合Dubbo分布式服務(wù)

    這篇文章主要介紹了詳解SpringBoot開(kāi)發(fā)案例之整合Dubbo分布式服務(wù),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10

最新評(píng)論

邯郸县| 通州市| 克拉玛依市| 吴桥县| 定兴县| 堆龙德庆县| 关岭| 岳普湖县| 嵊州市| 漠河县| 神木县| 武功县| 中牟县| 新建县| 晴隆县| 上栗县| 宿州市| 无锡市| 阳江市| 密山市| 饶河县| 牟定县| 和静县| 西吉县| 凌源市| 无极县| 东乡县| 平果县| 千阳县| 河南省| 兖州市| 缙云县| 湘乡市| 谷城县| 山东省| 迁西县| 辰溪县| 会同县| 晋城| 晋中市| 威信县|