一、背景
1.前面讲解了很多的基础理论知识,现在我们开始几个简单点的小栗子,来巩固下我们前面学习的基础知识,接下来我们来具体来讲解下例子吧。
2.参考这位博主的博客:https://blog.csdn.net/w_t_y_y/article/details/102817576,我会在他的基础之上再具体完善下我自己的东西。
二、实例一
1.ThreadPoolTaskExecutorConfig.java
package exceldemo.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
@Configuration
public class ThreadPoolTaskExecutorConfig {
private static int CORE_POOL_SIZE = 5;
private static int MAX_POOL_SIZE = 1000;
@Bean(name="threadPoolTaskExecutor")
public ThreadPoolTaskExecutor serviceJobTaskExecutor(){
ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();
//线程池维护线程的最少数量
poolTaskExecutor.setCorePoolSize(CORE_POOL_SIZE);
//线程池维护线程的最大数量
poolTaskExecutor.setMaxPoolSize(MAX_POOL_SIZE);
//线程池所使用的缓冲队列
poolTaskExecutor.setQueueCapacity(200);
//线程池维护线程所允许的空闲时间
poolTaskExecutor.setKeepAliveSeconds(30000);
poolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);
System.out.println(poolTaskExecutor);
return poolTaskExecutor;
}
}
2.MyOrderRunnableTask.java
public class MyOrderRunnableTask implements Runnable{
private String name;
public MyOrderRunnableTask(String name){
this.name = name;
}
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
name = "MyOrderRunnableTask";
System.out.println("MyOrderRunnableTask已执行");
}
}
3.MyOrderCallableTask.java
public class MyOrderCallableTask implements Callable<String> {
private String name;
public MyOrderCallableTask(String name) {
this.name = name;
}
@Override
public String call() throws Exception {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
name = "MyOrderCallableTask";
System.out.println("MyOrderCallableTask已执行");
return name;
}
}
4.MyOrderDemo.java
@RestController
@RequestMapping("/myOrderDemo")
public class MyOrderDemo {
@Autowired
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
@RequestMapping("/execute")
public void execute(){
String str = "execute方法";
threadPoolTaskExecutor.execute(new MyOrderRunnableTask(str));
System.out.println("主线程调用结束");
}
@RequestMapping("/submit")
public String submit(){
String str = "submit方法";
Future<String> future = threadPoolTaskExecutor.submit(new MyOrderCallableTask(str));
try {
str = future.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println("主线程调用结束");
return str;
}
@RequestMapping("/submit1")
public String submit1(){
String str = "";
try {
Future future = threadPoolTaskExecutor.submit(()->{
return myOrderCallTaskMethod("submit1方法");
});
str = (String) future.get();
System.out.println(str);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("主线程调用结束");
return str;
}
private String myOrderCallTaskMethod(String string) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return string;
}
}
5.postman直接测试结果就行了,结果就省略了。
三、实例二
1.项目结构
2.ThreadPoolTaskExecutorConfig.java
@Configuration
public class ThreadPoolTaskExecutorConfig {
private static int CORE_POOL_SIZE = 5;
private static int MAX_POOL_SIZE = 1000;
@Bean(name="threadPoolTaskExecutor")
public ThreadPoolTaskExecutor serviceJobTaskExecutor(){
ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();
//线程池维护线程的最少数量
poolTaskExecutor.setCorePoolSize(CORE_POOL_SIZE);
//线程池维护线程的最大数量
poolTaskExecutor.setMaxPoolSize(MAX_POOL_SIZE);
//线程池所使用的缓冲队列
poolTaskExecutor.setQueueCapacity(200);
//线程池维护线程所允许的空闲时间
poolTaskExecutor.setKeepAliveSeconds(30000);
poolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);
System.out.println(poolTaskExecutor);
return poolTaskExecutor;
}
}
3.User.java
public class User {
int age;
String userName;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
4.UserService.java
public interface UserService {
List<User> getByIds(List<Integer> ids);
void addUserAction();
}
5.UserServiceImpl.java
@Service("userService")
public class UserServiceImpl implements UserService {
@Override
public List<User> getByIds(List<Integer> ids) {
List<User> users = new ArrayList<>();
for (Integer id : ids) {
User user = new User();
user.setAge(id);
user.setUserName("用户" + id);
//耗时操作
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
users.add(user);
}
return users;
}
@Override
public void addUserAction() {
//耗时操作
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("行为记录");
}
}
6.DemoTask.java
public class DemoTask implements Runnable {
private List<Integer> ids ;
public DemoTask(List<Integer> ids){
this.ids = ids;
}
@Override
public void run() {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
//System.out.println("run "+ids.size());
}
}
7.UserTask.java
public class UserTask implements Callable<List<User>> {
private List<Integer> userIds;
private UserService userService;
public UserTask(List<Integer> queryIds, UserService userService) {
this.userService = userService;
this.userIds = queryIds;
//System.out.println("ids "+queryIds.size());
}
@Override
public List<User> call() throws Exception {
//System.out.println("*******************");
List<User> users = userService.getByIds(userIds);
return users;
}
}
8.postman调用接口(结果)
8.1.返回结果
8.2.后端输出结果
行为记录
耗时1568
四、结束
Always keep the faith!!!