1.同步例子
首先,我们服务模拟一个请求,代码如下:
@RestController
@RequestMapping("/demo")
@Slf4j
public class PersonController {
@Autowired
PersonService personService;
@RequestMapping("/hello")
public String addPerson() {
log.info(">>>>>>>> N1");
String person = personService.getPerson();
log.info(">>>>>>>> N4");
return person;
}
}
public interface PersonService {
String getPerson();
}
@Service
@Slf4j
public class PersonServiceImpl implements PersonService {
@SneakyThrows
@Override
public String getPerson() {
log.info(">>>>>>>> N2");
Thread.sleep(1500);
log.info(">>>>>>>> N3");
return "hello person!!";
}
}
输入http://localhost:8887/demo/hello
,访问得
由上图可知,我们提交一个请求,服务器就会创建一个线程为我们进行处理,是同步执行的
2.Async实现异步任务
1.在需要执行的方法上,加上@Async
@Async
@SneakyThrows
@Override
public String getPerson() {
log.info(">>>>>>>> N2");
Thread.sleep(1500);
log.info(">>>>>>>> N3");
return "hello person!!";
}
2.在启动类上开启异步@EnableAsync
@SpringBootApplication
@EnableAsync
public class AppMain {
public static void main(String[] args) {
SpringApplication.run(AppMain.class,args);
}
}
3.访问执行
@RequestMapping("/hello")
public String addPerson() {
log.info(">>>>>>>> N1");
String person = personService.getPerson();
log.info(person);
log.info(">>>>>>>> N4");
return person;
}
3.线程池
上面异步实现中,我们的一个异步任务打开了一个线程,完成后销毁。在高并发环境下,不断的分配新资源,可能导致系统资源耗尽。所以为了避免这个问题,我们为异步任务规划一个线程池。
1.配置线程池
@Configuration
public class ThreadPoolConfig {
@Bean("taskExecutor")
public Executor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(20);
executor.setQueueCapacity(200);
executor.setKeepAliveSeconds(60);
executor.setThreadNamePrefix("taskExecutor-");
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
return executor;
}
}
2.异步注解指定线程池名称
@Async("taskExecutor")
@SneakyThrows
@Override
public String getPerson() {
log.info(">>>>>>>> N2");
Thread.sleep(1500);
log.info(">>>>>>>> N3");
return "hello person!!";
}
3.访问得
4.@Scheduled实现定时任务
这个比较简单
5.quartz定时任务(
这个比较全面,一般项目中主要使用
后续再更新…