文章目录
前言
异步线程可能会非常小号cpu资源,大项目推荐使用mq异步实现。
1 App.java
@SpringBootApplication
@EnableAsync
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
2 Controller
package com.couragesteak.controller;
import com.couragesteak.service.MemberServiceAsync;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Slf4j
public class CsAsync {
@Autowired
private MemberServiceAsync memberServiceAsync;
@RequestMapping("/a_register")
public String A_Register() {
log.info(">>> 01");
memberServiceAsync.smsAsync();
log.info(">>> 03");
return "注册成功";
}
}
3 service
package com.couragesteak.service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class MemberServiceAsync {
@Async("taskExecutor")
public String smsAsync() {
log.info(">>> 2");
try {
log.info("正在发送中");
Thread.sleep(3000);
} catch (Exception e) {
}
return "恭喜注册成功";
}
}
4 多线程池封装
package com.couragesteak.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.TaskExecutor;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ThreadPoolExecutor;
@Configuration
@EnableAsync
public class ThreadPoolConfig {
private int corePoolSize = 3;
private int maxPoolSize = 3;
private int queueCapacity = 10;
private int keepAlive = 100;
@Bean
public TaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(queueCapacity);
executor.setThreadNamePrefix("thread-");
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.setWaitForTasksToCompleteOnShutdown(true);
return executor;
}
}
<p><h3>文章目录</h3><ul><ul><li><a href="#_2">前言</a></li><li><a href="#1_Appjava_6">1 App.java</a></li><li><a href="#2_Controller_18">2 Controller</a></li><li><a href="#3_service_56">3 service</a></li><li><a href="#4__91">4 多线程池封装</a></li></ul></ul></p>
<h2><a id="_2"></a>前言</h2>
<p>异步线程可能会非常小号cpu资源,大项目推荐使用mq异步实现。</p>
<h2><a id="1_Appjava_6"></a>1 App.java</h2>
<pre><div class="hljs"><code class="lang-java"><span class="hljs-meta">@SpringBootApplication</span>
<span class="hljs-meta">@EnableAsync</span> <span class="hljs-comment">// 开启异步注解</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">App</span> {
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">main</span><span class="hljs-params">(String[] args)</span> {
SpringApplication.run(App.class, args);
}
}
</code></div></pre>
<h2><a id="2_Controller_18"></a>2 Controller</h2>
<pre><div class="hljs"><code class="lang-java"><span class="hljs-comment">/*
* @Author : 有勇气的牛排(全网同名)
* @FileName: CsAsync.java
* desc :
* */</span>
<span class="hljs-keyword">package</span> com.couragesteak.controller;
<span class="hljs-keyword">import</span> com.couragesteak.service.MemberServiceAsync;
<span class="hljs-keyword">import</span> lombok.extern.slf4j.Slf4j;
<span class="hljs-keyword">import</span> org.springframework.beans.factory.annotation.Autowired;
<span class="hljs-keyword">import</span> org.springframework.web.bind.annotation.RequestMapping;
<span class="hljs-keyword">import</span> org.springframework.web.bind.annotation.RestController;
<span class="hljs-meta">@RestController</span>
<span class="hljs-meta">@Slf4j</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">CsAsync</span> {
<span class="hljs-meta">@Autowired</span>
<span class="hljs-keyword">private</span> MemberServiceAsync memberServiceAsync;
<span class="hljs-comment">// http://127.0.0.1:8080/a_register</span>
<span class="hljs-meta">@RequestMapping("/a_register")</span>
<span class="hljs-keyword">public</span> String <span class="hljs-title function_">A_Register</span><span class="hljs-params">()</span> {
log.info(<span class="hljs-string">">>> 01"</span>);
memberServiceAsync.smsAsync();
log.info(<span class="hljs-string">">>> 03"</span>);
<span class="hljs-keyword">return</span> <span class="hljs-string">"注册成功"</span>;
}
}
</code></div></pre>
<h2><a id="3_service_56"></a>3 service</h2>
<pre><div class="hljs"><code class="lang-java"><span class="hljs-comment">/*
* @Author : 有勇气的牛排(全网同名)
* @FileName: MemberServiceAsync.java
* desc :
* */</span>
<span class="hljs-keyword">package</span> com.couragesteak.service;
<span class="hljs-keyword">import</span> lombok.extern.slf4j.Slf4j;
<span class="hljs-keyword">import</span> org.springframework.scheduling.annotation.Async;
<span class="hljs-keyword">import</span> org.springframework.stereotype.Component;
<span class="hljs-meta">@Component</span>
<span class="hljs-meta">@Slf4j</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">MemberServiceAsync</span> {
<span class="hljs-meta">@Async("taskExecutor")</span> <span class="hljs-comment">// 指定线程池</span>
<span class="hljs-keyword">public</span> String <span class="hljs-title function_">smsAsync</span><span class="hljs-params">()</span> {
log.info(<span class="hljs-string">">>> 2"</span>);
<span class="hljs-keyword">try</span> {
log.info(<span class="hljs-string">"正在发送中"</span>);
Thread.sleep(<span class="hljs-number">3000</span>);
} <span class="hljs-keyword">catch</span> (Exception e) {
}
<span class="hljs-keyword">return</span> <span class="hljs-string">"恭喜注册成功"</span>;
}
}
</code></div></pre>
<h2><a id="4__91"></a>4 多线程池封装</h2>
<pre><div class="hljs"><code class="lang-java"><span class="hljs-comment">/*
* @Author : 有勇气的牛排(全网同名)
* @FileName: ThreadPoolConfig.java
* desc : 线程池配置
* */</span>
<span class="hljs-keyword">package</span> com.couragesteak.config;
<span class="hljs-keyword">import</span> org.springframework.context.annotation.Bean;
<span class="hljs-keyword">import</span> org.springframework.context.annotation.Configuration;
<span class="hljs-keyword">import</span> org.springframework.core.task.TaskExecutor;
<span class="hljs-keyword">import</span> org.springframework.scheduling.annotation.EnableAsync;
<span class="hljs-keyword">import</span> org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
<span class="hljs-keyword">import</span> java.util.concurrent.ThreadPoolExecutor;
<span class="hljs-meta">@Configuration</span>
<span class="hljs-meta">@EnableAsync</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> <span class="hljs-title class_">ThreadPoolConfig</span> {
<span class="hljs-comment">/**
* 每秒需要多少个线程处理?
* tasks/(1/taskcost)
*/</span>
<span class="hljs-keyword">private</span> <span class="hljs-type">int</span> <span class="hljs-variable">corePoolSize</span> <span class="hljs-operator">=</span> <span class="hljs-number">3</span>;
<span class="hljs-comment">/**
* 线程池维护线程的最大数量
* (max(tasks)- queueCapacity)/(1/taskcost)
*/</span>
<span class="hljs-keyword">private</span> <span class="hljs-type">int</span> <span class="hljs-variable">maxPoolSize</span> <span class="hljs-operator">=</span> <span class="hljs-number">3</span>;
<span class="hljs-comment">/**
* 缓存队列
* (coreSizePool/taskcost)*responsetime
*/</span>
<span class="hljs-keyword">private</span> <span class="hljs-type">int</span> <span class="hljs-variable">queueCapacity</span> <span class="hljs-operator">=</span> <span class="hljs-number">10</span>;
<span class="hljs-comment">/**
* 允许的空闲时间
* 默认为60
*/</span>
<span class="hljs-keyword">private</span> <span class="hljs-type">int</span> <span class="hljs-variable">keepAlive</span> <span class="hljs-operator">=</span> <span class="hljs-number">100</span>;
<span class="hljs-meta">@Bean</span>
<span class="hljs-keyword">public</span> TaskExecutor <span class="hljs-title function_">taskExecutor</span><span class="hljs-params">()</span> {
<span class="hljs-type">ThreadPoolTaskExecutor</span> <span class="hljs-variable">executor</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">ThreadPoolTaskExecutor</span>();
<span class="hljs-comment">// 设置核心线程数</span>
executor.setCorePoolSize(corePoolSize);
<span class="hljs-comment">// 设置最大线程数</span>
executor.setMaxPoolSize(maxPoolSize);
<span class="hljs-comment">// 设置队列容量</span>
executor.setQueueCapacity(queueCapacity);
<span class="hljs-comment">// 设置允许的空闲时间(秒)</span>
<span class="hljs-comment">//executor.setKeepAliveSeconds(keepAlive);</span>
<span class="hljs-comment">// 设置默认线程名称</span>
executor.setThreadNamePrefix(<span class="hljs-string">"thread-"</span>);
<span class="hljs-comment">// 设置拒绝策略rejection-policy:当pool已经达到max size的时候,如何处理新任务</span>
<span class="hljs-comment">// CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行</span>
executor.setRejectedExecutionHandler(<span class="hljs-keyword">new</span> <span class="hljs-title class_">ThreadPoolExecutor</span>.CallerRunsPolicy());
<span class="hljs-comment">// 等待所有任务结束后再关闭线程池</span>
executor.setWaitForTasksToCompleteOnShutdown(<span class="hljs-literal">true</span>);
<span class="hljs-keyword">return</span> executor;
}
}
</code></div></pre>
留言