国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java開啟異步的兩種方式

這篇具有很好參考價值的文章主要介紹了Java開啟異步的兩種方式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

二、Java開啟異步的兩種方式

1、注解開啟:@Async

1.1、配置異步的線程池

  • 必須配置異步線程池,否則異步不會生效。
  • @EnableAsync 注解:指定異步線程池。不指定默認使用:SimpleAsyncTaskExecutor線程池
  • SimpleAsyncTaskExecutor是一個最簡單的線程池,它沒有任何的線程相關(guān)參數(shù)配置,它會為每個任務(wù)創(chuàng)建一個新的線程來執(zhí)行,因此不建議在生產(chǎn)環(huán)境中使用。
  • 配置線程池見:https://www.cnblogs.com/kakarotto-chen/p/17428432.html
package com.cc.md.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.ThreadPoolExecutor;

/** IO型的線程池
 * @author CC
 * @since 2023/5/23 0023
 */
@Configuration
@EnableAsync
public class IoThreadPool {

    public static final int THREAD_SIZE = 2 * (Runtime.getRuntime().availableProcessors());
    
    public static final int QUEUE_SIZE = 1000;

    @Bean(name = "myIoThreadPool")
    public ThreadPoolTaskExecutor threadPoolExecutor(){
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(THREAD_SIZE);
        executor.setMaxPoolSize(THREAD_SIZE);
        executor.setQueueCapacity(QUEUE_SIZE);
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
        executor.setKeepAliveSeconds(60);
        executor.setAllowCoreThreadTimeOut(true);
        executor.setAwaitTerminationSeconds(300);
        executor.setWaitForTasksToCompleteOnShutdown(true);
        executor.setThreadNamePrefix("myIo-Th-Pool-");
        executor.initialize();
        return executor;
    }
}

1.2、異步方法

  • 異步方法必須寫在另一個類中,否則不生效
  • @Async可以打在類上、也可以打在方法上
    1 @Async:類上,說明整個類中的方法都是異步。必須寫我們自己配置的線程池 —— ("myIoThreadPool")
    2 @Async:方法上,說明這個方法是異步。不用寫我們自己配置的線程池
  • 異步接口+實現(xiàn)類

接口

package com.cc.md.service;

/**
 * @author CC
 * @since 2023/5/24 0024
 */
public interface IAsyncService {

    /** 異步方法1
     * @since 2023/5/24 0024
     * @author CC
     **/
    void async1();

    /** 異步方法2
     * @since 2023/5/24 0024
     * @author CC
     **/
    void async2();

}

實現(xiàn)類

package com.cc.md.service.impl;

import com.cc.md.service.IAsyncService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

/** 1 @Async:類上,說明整個類中的方法都是異步。必須寫我們自己配置的線程池 —— ("myIoThreadPool")
 *  2 @Async:方法上,說明這個方法是異步。不用寫我們自己配置的線程池
 * @author CC
 * @since 2023/5/24 0024
 */
@Service
@Async("myIoThreadPool")
public class AsyncServiceImpl implements IAsyncService {

    private static final Logger log = LoggerFactory.getLogger(AsyncServiceImpl.class);

    //類上寫了@Async,這里就可以不寫了。
    //可以不寫 ("myIoThreadPool")。因為在IoThreadPool中開啟了異步,說明異步用的就是我們配置的io線程池
    //如果類上面打了 @Async ,這里必須寫:("myIoThreadPool")
    @Override
    //@Async
    public void async1(){
        //模仿io流耗時
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        log.info("打印:{}", "異步方法1111!");
    }

    //@Async在類上面,說明這個方法也是異步方法。如果不打,無法開啟異步。
    @Override
    public void async2(){
        //模仿io流耗時
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        log.info("打?。簕}", "異步方法2222!");
    }
}

1.3、測試

    @Resource
    private IAsyncService asyncService;
    
    //開啟異步1 —— @Async
    @Test
    public void test03() throws Exception {
        log.info("打?。簕}", "異步測試的-主方法1");
        asyncService.async1();
        asyncService.async2();
        //不會等待異步方法執(zhí)行,直接返回前端數(shù)據(jù)
        log.info("打?。簕}", "異步測試的-主方法2");
    }

結(jié)果:

Java開啟異步的兩種方式

2、CompletableFuture的方式

使用:

    @Resource(name = "myIoThreadPool")
    private ThreadPoolTaskExecutor myIoThreadPool;
    
    //開啟異步2 —— CompletableFuture.runAsync()
    @Test
    public void test04() throws Exception {
        log.info("打?。簕}", "異步測試的-主方法1");
        CompletableFuture.runAsync(() -> {
            log.info("打?。簕}", "異步方法1!");
            //異步執(zhí)行的代碼,也可以是方法,該方法不用單獨寫到其他類中。
            this.async2("異步方法1!-end");
        }, myIoThreadPool);
        //不會等待異步方法執(zhí)行,直接返回前端數(shù)據(jù)
        log.info("打?。簕}", "異步測試的-主方法2");
    }

    //異步需要執(zhí)行的方法,可以寫在同一個類中。
    private void async2(String msg) {
        //模仿io流耗時
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        log.info("打?。簕}", msg);
    }

結(jié)果:

Java開啟異步的兩種方式文章來源地址http://www.zghlxwxcb.cn/news/detail-457457.html

  • 后續(xù)CompletableFuture的使用見:《Java的CompletableFuture,Java的多線程開發(fā)》

到了這里,關(guān)于Java開啟異步的兩種方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • ES的兩種認證登錄方式: JAVA REST Client/HTTP Client

    通過RestHighLevelClient發(fā)送的es請求驗證方式: 通過http直接發(fā)送的es請求認證方式:

    2024年02月16日
    瀏覽(22)
  • 【Redis,Java】Redis的兩種序列化方式—nosql數(shù)據(jù)庫

    【Redis,Java】Redis的兩種序列化方式—nosql數(shù)據(jù)庫

    redis和mysql的區(qū)別: redis是屬于nosql的數(shù)據(jù)庫,而mysql是屬于sql數(shù)據(jù)庫,redis是屬于nosql數(shù)據(jù)庫。mysql是存儲在磁盤中的,redis是存儲在內(nèi)存中的,所以redis的讀取書讀快。這里所說的redis代表nosql,而mysql代表sql。 redis的數(shù)據(jù)庫是以鍵值對為基礎(chǔ)存儲在內(nèi)存中的,而mysql為代表的關(guān)

    2024年02月21日
    瀏覽(25)
  • java 將word轉(zhuǎn)為pdf文件的兩種方式【spire.doc.free】【documents4j】

    java 將word轉(zhuǎn)為pdf文件的兩種方式【spire.doc.free】【documents4j】

    如資產(chǎn)證明等場景下,一般要求同時生成word與pdf兩種格式的證明文件,且兩者格式需保持一致,可以各自單獨生成,但那樣可能需要維護兩個模板文件,所以也可以僅定義一份word的模板文件,使用模板生成word文件,再將word轉(zhuǎn)換為pdf,這樣不僅少維護一個模板,也可以保證

    2024年02月12日
    瀏覽(26)
  • Containerd的兩種安裝方式

    Containerd的兩種安裝方式

    1. 輕量級容器管理工具 Containerd 2. Containerd的兩種安裝方式 3. Containerd容器鏡像管理 4. Containerd數(shù)據(jù)持久化和網(wǎng)絡(luò)管理 操作系統(tǒng)環(huán)境為centos7u6 1.1 獲取YUM源 1.2 使用yum命令安裝 1.3 驗證安裝及啟動服務(wù) 1.4 驗證可用性 Containerd有兩種安裝包: 第一種是 containerd-xxx ,這種包用于單機測

    2024年02月14日
    瀏覽(19)
  • 封裝axios的兩種方式

    作為前端工程師,經(jīng)常需要對axios進行封裝以滿足復(fù)用的目的。在不同的前端項目中使用相同的axios封裝有利于保持一致性,有利于數(shù)據(jù)之間的傳遞和處理。本文提供兩種對axios進行封裝的思路。 首先導(dǎo)入了 axios, AxiosInstance和AxiosResponse模塊 ,用于創(chuàng)建一個http請求的實例和處理

    2024年02月08日
    瀏覽(13)
  • ssh的兩種登錄方式

    ssh的兩種登錄方式

    1. 密碼登錄 這是默認的一種登錄方式,如圖: 輸入密碼以后成功登錄shell: 以后每次登錄都得輸入密碼,比較麻煩。 2. 公鑰登錄 為了方便,ssh還提供了使用公鑰的登錄方式,原理為在client生成一對公私鑰,client保留私鑰,把公鑰寫入server。具體方式如下: 一、 在client: 生

    2024年02月16日
    瀏覽(20)
  • QT打包的兩種方式

    QT打包的兩種方式

    QT打包的兩種方式: 一個是QT5自帶的windeployqt(不需要下載安裝),它可以找到程序(exe)用到的所有庫文件,并且都拷貝到exe程序的當(dāng)前文件。此時打包的exe較小,需要和拷貝進來的文件放一起運行,也可以將這些文件再次打包成一個大的exe文件,此時用的第二種打包方式

    2024年02月16日
    瀏覽(26)
  • sqlmap的兩種掛代理方式

    sqlmap的兩種掛代理方式

    文章目錄 前言 一、第一種方式直接掛代理 二、第二種方式間接掛代理 為什么要掛代理呢: sqlmap原理和暴力破解類似如果速度過快則會很容易被封ip,所以掛代理是避免這種情況的發(fā)生,即使發(fā)生也可以切換其他ip。 一、第一種方式直接掛代理 ?可在-u之后直接輸入--proxy?

    2024年02月12日
    瀏覽(24)
  • 快速獲取cookie的兩種方式

    快速獲取cookie的兩種方式

    在需要獲取Cookie的谷歌瀏覽器界面,按Ctrl+Shift+j打開js控制臺。 輸入 console.log(document.cookie) 回車打印Cookies 新建書簽,書簽名稱隨意,書簽的網(wǎng)址是以下網(wǎng)址: 在需要獲取Cookie的頁面,點擊這個小書簽,就直接復(fù)制好了Cookie了。 以上兩種方式是自用實測比較方便高效的,在此

    2024年02月11日
    瀏覽(30)
  • Docker引擎安裝的兩種方式

    Docker引擎安裝的兩種方式

    1. 規(guī)劃節(jié)點 Docker部署節(jié)點規(guī)劃如下表所示: IP 主機名 節(jié)點 192.168.100.10 master Docker節(jié)點 2. 基礎(chǔ)準(zhǔn)備 所有節(jié)點安裝CentOS7.9_2009系統(tǒng),并配置主機名和網(wǎng)卡。 配置主機名和網(wǎng)卡 查看linux版本,是否符合centos 7 查看網(wǎng)絡(luò)是否通暢 安裝gcc,gcc-c++編譯器 ? 安裝device-mapper-persistent-data和

    2024年03月26日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包