中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Spring boot中對多線程進行配置

發布時間:2021-03-05 17:13:03 來源:億速云 閱讀:213 作者:Leah 欄目:編程語言

這篇文章給大家介紹怎么在Spring boot中對多線程進行配置,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

1、配置線程配置類

package test;

import java.util.concurrent.Executor;

import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

@Configuration
@ComponentScan("test")
@EnableAsync
// 線程配置類
public class AsyncTaskConfig implements AsyncConfigurer {

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

  @Override
  public Executor getAsyncExecutor() {
    ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
    taskExecutor.setCorePoolSize(5);// 最小線程數
    taskExecutor.setMaxPoolSize(10);// 最大線程數
    taskExecutor.setQueueCapacity(25);// 等待隊列

    taskExecutor.initialize();

    return taskExecutor;
  }

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

2、定義線程執行任務類

package test;

import java.util.Random;
import java.util.concurrent.Future;

import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Service;

@Service
// 線程執行任務類
public class AsyncTaskService {

  Random random = new Random();// 默認構造方法

  @Async
  // 表明是異步方法
  // 無返回值
  public void executeAsyncTask(Integer i) {
    System.out.println("執行異步任務:" + i);
  }

  /**
   * 異常調用返回Future
   * 
   * @param i
   * @return
   * @throws InterruptedException
   */
  @Async
  public Future<String> asyncInvokeReturnFuture(int i) throws InterruptedException {
    System.out.println("input is " + i);
    Thread.sleep(1000 * random.nextInt(i));

    Future<String> future = new AsyncResult<String>("success:" + i);// Future接收返回值,這里是String類型,可以指明其他類型

    return future;
  }
}

3、調用

package test;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.core.task.TaskRejectedException;

public class Application {

  public static void main(String[] args) throws InterruptedException, ExecutionException {
    // testVoid();

    testReturn();
  }

  // 測試無返回結果
  private static void testVoid() {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AsyncTaskConfig.class);
    AsyncTaskService asyncTaskService = context.getBean(AsyncTaskService.class);

    // 創建了20個線程
    for (int i = 1; i <= 20; i++) {
      asyncTaskService.executeAsyncTask(i);
    }

    context.close();
  }

  // 測試有返回結果
  private static void testReturn() throws InterruptedException, ExecutionException {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AsyncTaskConfig.class);
    AsyncTaskService asyncTaskService = context.getBean(AsyncTaskService.class);

    List<Future<String>> lstFuture = new ArrayList<Future<String>>();// 存放所有的線程,用于獲取結果

    // 創建100個線程
    for (int i = 1; i <= 100; i++) {
      while (true) {
        try {
          // 線程池超過最大線程數時,會拋出TaskRejectedException,則等待1s,直到不拋出異常為止
          Future<String> future = asyncTaskService.asyncInvokeReturnFuture(i);
          lstFuture.add(future);

          break;
        } catch (TaskRejectedException e) {
          System.out.println("線程池滿,等待1S。");
          Thread.sleep(1000);
        }
      }
    }

    // 獲取值。get是阻塞式,等待當前線程完成才返回值
    for (Future<String> future : lstFuture) {
      System.out.println(future.get());
    }

    context.close();
  }
}

maven配置

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>TestAysc</groupId>
 <artifactId>TestAysc</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <dependencies>
   <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot</artifactId>
     <version>1.5.6.RELEASE</version>
   </dependency>
   <dependency>
     <groupId>org.springframework</groupId>
     <artifactId>spring-aop</artifactId>
     <version>4.3.10.RELEASE</version>
   </dependency>
 </dependencies>
</project>

結果展示:

1、無返回結果

怎么在Spring boot中對多線程進行配置

2、有返回結果

怎么在Spring boot中對多線程進行配置

關于怎么在Spring boot中對多線程進行配置就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

冷水江市| 施秉县| 汕尾市| 韩城市| 太保市| 广东省| 启东市| 张家口市| 衡东县| 故城县| 平武县| 澜沧| 衢州市| 崇阳县| 个旧市| 伊金霍洛旗| 武宁县| 江川县| 基隆市| 霸州市| 乐东| 中宁县| 曲周县| 顺平县| 民丰县| 定西市| 阳江市| 苍南县| 赞皇县| 焉耆| 台南市| 新宁县| 宁武县| 卓尼县| 西平县| 锡林郭勒盟| 松江区| 平凉市| 镇江市| 江永县| 神木县|