一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Spring boot多線程配置方法

Spring boot多線程配置方法

2021-01-28 11:48瘦魚 Java教程

這篇文章主要為大家詳細介紹了Spring boot多線程配置方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了Spring boot多線程配置的具體代碼,供大家參考,具體內容如下

1、配置線程配置類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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、定義線程執行任務類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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、調用

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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配置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<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多線程配置方法

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/yangtze-yufei/p/7754147.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美亚洲影院 | 俄罗斯美女大逼 | 午夜福利理论片高清在线 | 国产综合色在线视频区色吧图片 | 成人私人影院在线版 | 天天做天天玩天天爽天天 | 免费看黄色大片 | 四虎最新网址在线观看 | 日本人交换乱理伦片 | 男人综合网 | 亚洲精品专区 | 996热精品视频在线观看 | 毛片免费全部免费观看 | 亚洲AV无码专区国产乱码网站 | 欧美贵妇videos办公室360 | 男模chinesegayxxxx| 成人免费一区二区三区在线观看 | 国产精品一区牛牛影视 | 午夜国产精品福利在线观看 | 能免费观看的韩剧 | www.一级片.com | 国产v视频 | 久久91精品国产91久久户 | 小舞同人18av黄漫网站 | 日本视频二区 | 亚洲美女人黄网成人女 | 亚洲 日本 天堂 国产 在线 | 美国玩尿眼道videos | 国产精品国产国产aⅴ | 4455四色永久免费 | 强插美女 | 成人免费播放 | 扒开胸流出吃奶 | 欧美日韩中文字幕久久伊人 | 男男羞羞视频网站国产 | 日本高清在线看免费观看 | 国产成人精品在线观看 | 亚洲国产无线码在线观看 | 岛国免费大片 | 国产免费成人在线视频 | tkvk视频|