service中的两个线程方法
@Slf4j
@Service
public class Score {
@Async
public void addScore(){
try {
Thread.sleep(5000);
log.info("处理积分1");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Async("scorePoolTaskExecutor")
public void addScore2(){
try {
Thread.sleep(5000);
log.info("处理积分2");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
在控制器中调用这个方法时,会先执行控制器中的方法,
@Configuration
@EnableAsync
@Autowired
private Score score;
@GetMapping("/score1")
public String score1(){
log.info("这是主线程");
this.score.addScore();
return "ok";
}
可以看到输出这是主线程和过5秒后输出处理积分1,是不同的线程
但是会立刻输出ok,然后过5秒后输出处理积分1
如果不用同步,那么就是等待5秒后才会输出ok
java的线程池
在config下新建一个SyncConfiguration类
@Configuration
@EnableAsync
public class SyncConfiguration {
@Bean(name = "scorePoolTaskExecutor")
public ThreadPoolTaskExecutor getScorePoolTaskExecutor() {
ThreadPoolTaskExecutor task = new ThreadPoolTaskExecutor();
//核心线程数
task.setCorePoolSize(10);
//线程池维护线程的最大数量
task.setMaxPoolSize(100);
//缓存队列
task.setQueueCapacity(50);
//许的空闲时间
task.setKeepAliveSeconds(200);
task.setThreadNamePrefix("score-");
//当线程池的任务缓存队列已满,并且线程池中的线程数达到maximumPoolSize,如果还有任务来到就会采取任务拒绝策略
//ThreadPoolExecutor.AbortPolicy丢弃任务并跑去RejectedExecutionException策略
//ThreadPoolExecutor.DiscardPolicy丢弃任务,但是不抛出异常
//ThreadPoolExecutor.DiscardOldestPolicy丢弃队列最前面的任务,然后重新常使执行任务
//ThreadPoolExecutor.CallerRunsPolicy重试添加当前的任务,自动重复调用execute方法,直到成功
task.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
task.initialize();
return task;
}
}
在service类中增加,导入线程的这个包
import com.example.demo.config.SyncConfiguration;
@Async("scorePoolTaskExecutor")
public void addScore2(){
try {
Thread.sleep(5000);
log.info("处理积分2");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
在控制器中调用该方法
@Autowired
private Score score;
@GetMapping("/score2")
public String score2(){
log.info("score2的主线程");
this.score.addScore2();
return "ok";
}