精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

SpringBoot實現多線程

jf_96884364 ? 來源:jf_96884364 ? 作者:jf_96884364 ? 2023-01-12 16:59 ? 次閱讀

代碼地址:https://github.com/Snowstorm0/learn-async

1 線程同步和異步

線程同步 :A線程要請求某個資源,但是此資源正在被B線程使用中,因為同步機制存在,A只能等待下去。耗時較長,安全性較高。

線程異步 :A線程要請求某個資源,但是此資源正在被B線程使用中,因為沒有同步機制存在,A線程仍然請求的到。

一個進程啟動的多個不相干的進程,他們之間的相互關系為異步;同步必須執行到底后才能執行其他操作,異步可同時執行。

多個線程執行的時候需要同步,如果是單線程則不需要同步。

2 異步實例

主方法和被調用的方法必須是不同的類,才能實現多線程。

2.1 啟動類

使用@EnableAsync來開啟 SpringBoot 對于異步任務的支持。

Application:

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

2.2 線程池

配置類實現接口AsyncConfigurator,返回一個ThreadPoolTaskExecutor線程池對象。

config/AsyncConfig:

@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {

    // ThredPoolTaskExcutor的處理流程
    // 當池子大小小于corePoolSize,就新建線程,并處理請求
    // 當池子大小等于corePoolSize,把請求放入workQueue中,池子里的空閑線程就去workQueue中取任務并處理
    // 當workQueue放不下任務時,就新建線程入池,并處理請求,如果池子大小撐到了maximumPoolSize,就用RejectedExecutionHandler來做拒絕處理
    // 當池子的線程數大于corePoolSize時,多余的線程會等待keepAliveTime長時間,如果無請求可處理就自行銷毀

    @Override
    @Bean
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 核心線程數:線程池創建的時候初始化的線程數
        executor.setCorePoolSize(10);
        // 最大線程數:線程池最大的線程數,只有緩沖隊列滿了之后才會申請超過核心線程數的線程
        executor.setMaxPoolSize(100);
        // 緩沖隊列:用來緩沖執行任務的隊列
        executor.setQueueCapacity(50);
        // 線程池關閉:等待所有任務都完成再關閉
        executor.setWaitForTasksToCompleteOnShutdown(true);
        // 等待時間:等待5秒后強制停止
        executor.setAwaitTerminationSeconds(5);
        // 允許空閑時間:超過核心線程之外的線程到達60秒后會被銷毀
        executor.setKeepAliveSeconds(60);
        // 線程名稱前綴
        executor.setThreadNamePrefix("learn-Async-");
        // 初始化線程
        executor.initialize();
        return executor;
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return null;
    }
}

2.3 controller

通過該層調用測試 Async。

@RestController
@RequestMapping("/homepage")
public class AsyncController {
    @Autowired
    AsyncService asyncTaskService;
    @GetMapping("/learnAsync")
    public String learnAsync(){
        for (int i = 0; i < 10; i++) {
            asyncTaskService.executeAsyncTask(i);
        }
        return "1";
    }
}

2.4 service

通過@Async注解表明該方法是異步方法,如果注解在類上,那表明這個類里面的所有方法都是異步的。

@Service
public class AsyncService {
    private final static Logger logger = LoggerFactory.getLogger(com.spring.boot.service.AsyncService.class);
    @Async  // 表明該方法是異步方法。如果注解在類上,那表明類里面的所有方法都是異步
    public void executeAsyncTask(int i) {
        logger.info("\\t 完成任務" + i);
        System.out.println("線程" + Thread.currentThread().getName() + " 執行異步任務:" + i);
    }
}

2.5 輸出

3 Future 類

修改service層,分別使用同步調用、異步調用無返回、異步調用使用 Future 返回。

3.1 同步調用

public long subBySync() throws Exception {
    long start = System.currentTimeMillis();
    long sum = 0;
    long end = System.currentTimeMillis();
    sum = end - start;
    return sum;
}

3.2 異步調用無返回

@Async
public void subByVoid() throws Exception {
    long start = System.currentTimeMillis();
    long sum = 0;
    long end = System.currentTimeMillis();
    sum = end - start;
}

3.3 異步調用 Future 返回

controller:

Future task = asyncTaskService.subByAsync();

service:

@Async
public Future subByAsync() throws Exception {
    long start = System.currentTimeMillis();
    long sum = 0;
    long end = System.currentTimeMillis();
    sum = end - start;
    return new AsyncResult<>(sum);
}

4 CompletableFuture 類

若使用 Future 出現報錯:

無法判斷org.springframework.scheduling.annotation.AsyncResult<>的類型參數

不存在類型變量V的實例,使org.springframework.scheduling.annotation.AsyncResult符合XXX

可以使用 CompletableFuture 類:

@Asyncpublic 
CompletableFuture> subByAsyncMap() throws Exception {
    Map res = new HashMap<>();
    return CompletableFuture.completedFuture(res);
}

5 線程關閉

當線程數量超過核心線程數量之后,運行完畢的舊的線程會被關閉。

可以通過定時任務測試。

batch/ScheduledTaskService:

@Component
@EnableScheduling
public class ScheduledTaskService {
    @Autowired
    AsyncService asyncService;
    @Scheduled(cron = "1/1 * * * * ? ")  //1s一次
    public void learnCron(){
        asyncService.learnScheduledAsync();
    }
}

在 AsyncService 添加方法:

// 使用定時任務調用此方法創建線程
@Async
public void learnScheduledAsync(){
    Long timeLong = System.currentTimeMillis();
    SimpleDateFormat timeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //設置格式
    String timeString = timeFormat.format(timeLong);
    System.out.println("線程" + Thread.currentThread().getName());
    System.out.println("timeString:" + timeString + "\\n");
}

在異步配置(AsyncConfig)中已設置核心線程數為10:

// 核心線程數:線程池創建的時候初始化的線程數
executor.setCorePoolSize(10);

運行可以觀察輸出,線程數達到10后會再一次從1開始。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2942

    瀏覽量

    104081
  • 多線程
    +關注

    關注

    0

    文章

    275

    瀏覽量

    19848
  • spring
    +關注

    關注

    0

    文章

    335

    瀏覽量

    14254
  • Boot
    +關注

    關注

    0

    文章

    148

    瀏覽量

    35672
  • SpringBoot
    +關注

    關注

    0

    文章

    172

    瀏覽量

    145
收藏 人收藏

    評論

    相關推薦

    Java多線程的用法

    能力。 什么是進程 是指正在運行的程序的實例。 每個進程都擁有自己的內存空間、代碼、數據和文件等資源,可以獨立運行、調度和管理。在操作系統中,進程是系統資源分配的最小單位,是實現多任務的基礎。 Java多線程 Java多線程是指
    的頭像 發表于 09-30 17:07 ?841次閱讀

    利用線程的互斥實現串口多線程收發數據

    利用線程的互斥實現串口多線程收發數據從而達到流水燈的效果。多線程串口編程主要分為三步,第一部分,連接串口及開發板,確定設備號;第二部分為串口參數的設置;第三部分為
    發表于 01-07 08:08

    多線程技術在串口通信中的應用

            首先介紹了多線程技術的基本原理,然后討論了多線程技術在串口通信中的應用,并給出了實現的方法和步驟。關鍵詞:
    發表于 09-04 09:10 ?18次下載

    多線程實現網絡入侵檢測的負載均衡

    本內容詳細介紹了多線程實現 網絡入侵 檢測的負載均衡
    發表于 06-29 16:01 ?20次下載
    <b class='flag-5'>多線程</b><b class='flag-5'>實現</b>網絡入侵檢測的負載均衡

    實現多線程IP和DomainName相互轉換_Delphi教程

    Delphi教程實現多線程IP和DomainName相互轉換,很好的Delphi學習資料。
    發表于 03-16 14:58 ?7次下載

    Delphi教程_實現多線程共享探測

    Delphi教程實現多線程共享探測,很好的Delphi學習資料。
    發表于 03-16 14:59 ?3次下載

    多線程與聊天室程序的創建

    多線程程序的編寫,多線程應用中容易出現的問題。互斥對象的講解,如何采用互斥對象來實現多線程的同步。如何利用命名互斥對象保證應用程序只有一個實例運行。應用
    發表于 05-16 15:22 ?0次下載

    多線程好還是單線程好?單線程多線程的區別 優缺點分析

    摘要:如今單線程多線程已經得到普遍運用,那么到底多線程好還是單線程好呢?單線程多線程的區別又
    發表于 12-08 09:33 ?8.1w次閱讀

    mfc多線程編程實例及代碼,mfc多線程間通信介紹

    摘要:本文主要以MFC多線程為中心,分別對MFC多線程的實例、MFC多線程之間的通信展開的一系列研究,下面我們來看看原文。
    發表于 12-08 15:23 ?1.7w次閱讀
    mfc<b class='flag-5'>多線程</b>編程實例及代碼,mfc<b class='flag-5'>多線程</b>間通信介紹

    什么是多線程編程?多線程編程基礎知識

    摘要:多線程編程是現代軟件技術中很重要的一個環節。要弄懂多線程,這就要牽涉到多進程。本文主要以多線程編程以及多線程編程相關知識而做出的一些結論。
    發表于 12-08 16:30 ?1.2w次閱讀

    Linux下的多線程編程

    接口,稱為pthread。編寫Linux下的多線程程序,需要使用頭文件pthread.h,連接時需要使用庫libpthread.a。順便說一下,Linux下pthread的實現是通過系統調用clone
    發表于 04-02 14:43 ?545次閱讀

    labview AMC多線程

    labview_AMC多線程
    發表于 08-21 10:31 ?27次下載

    多線程如何保證數據的同步

    多線程編程是一種并發編程的方法,意味著程序中同時運行多個線程,每個線程可獨立執行不同的任務,共享同一份數據。由于多線程并發執行的特點,會引發數據同步的問題,即保證多個
    的頭像 發表于 11-17 14:22 ?876次閱讀

    mfc多線程編程實例

    (圖形用戶界面)應用程序的開發。在這篇文章中,我們將重點介紹MFC中的多線程編程。 多線程編程在軟件開發中非常重要,它可以實現程序的并發執行,提高程序的效率和響應速度。MFC提供了豐富的多線程
    的頭像 發表于 12-01 14:29 ?1132次閱讀

    java實現多線程的幾種方式

    Java實現多線程的幾種方式 多線程是指程序中包含了兩個或以上的線程,每個線程都可以并行執行不同的任務或操作。Java中的
    的頭像 發表于 03-14 16:55 ?430次閱讀