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

Spring 與 JDK 線程池的簡單使用示例詳解

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

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

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

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

}

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

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

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

//  //有返回值(ObjectVo為自己定義的返回類型)
//@Async("taskScheduler")
//public Future<ObjectVo> doTaskScheduler() {
//	System.out.println("任務(wù)開始調(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;
  //測試任務(wù)執(zhí)行與調(diào)用
  @SneakyThrows
  @Override
  public void testTask(){
	//沒有返回值
	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實現(xiàn)類)

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

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

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

無界隊列(當(dāng)隊列過多時,會造成無限循環(huán))

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

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

在極端情況下, 

CachedThreadPool會因為創(chuàng)建過多線程而耗盡CPU和內(nèi)存資源

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

無界隊列(當(dāng)隊列過多時,會造成無限循環(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)用線程中運行被拒絕的任務(wù)。

DiscardOldestPolicy:放棄最舊的未處理請求,重試execute。

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

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

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

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

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

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

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

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

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

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

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

相關(guān)文章

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

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

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

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

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

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

    這篇文章主要介紹了java 通過cmd 調(diào)用命令啟動tomcat的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    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兩種方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • java從文件中讀取數(shù)據(jù)的六種方法

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

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

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

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

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

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

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

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

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

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

最新評論

武冈市| 贵德县| 连山| 安顺市| 修文县| 广丰县| 通海县| 台北县| 龙泉市| 屯门区| 新闻| 德清县| 来凤县| 恩施市| 株洲县| 阿克| 汾阳市| 尼勒克县| 太康县| 弥渡县| 通河县| 鲜城| 武定县| 松桃| 木兰县| 江北区| 高青县| 页游| 泸水县| 辽阳市| 德保县| 廉江市| 通榆县| 沙洋县| 抚宁县| 安阳县| 涡阳县| 阿坝县| 台北县| 布拖县| 托里县|