阿里巴巴-《码出高效》-任务队列实际应用
Java项目开发中处理一些复杂的计算任务时,很多时候不使用同步的处理方式,而是使用异步多线程的方式
来进行处理,并且会使用到Java中的任务队列。本篇文章就来讲讲任务队列的实际应用,首先看看阿里巴巴出品
的一本书籍《码出高效》中讲到线程池的时候,有使用到任务队列举例,如下所示:
现在项目中已经实际应用起来。首先创建一个用来添加任务的任务类,可以放在定时任务中进行执行一次或者多次;
每执行一次就会判断队列中的任务数是否已满,未满的话就继续添加任务执行类。
public class TaskTwo implements Runnable{
@Resource
private TaskTwoPoolUtils taskTwoPoolUtils;
@Override
public void run() {
// 当队列中的的任务数小于5的时候,就继续添加任务
while (taskTwoPoolUtils.getQueueSize() <= 5) {
// 注意:获取的任务执行类是多实例的
TaskTwoTask taskTwoTask = new TaskTwoTask();
taskTwoPoolUtils.execcuteTask(taskTwoTask);
}
}
}
任务队列的工具类如下,相当于把上面图片中的代码单独抽取出来,进行统一处理。主要作用是初始化执行任务队列
的线程池,初始化队列的大小。
@Slf4j
@Component
public class TaskTwoPoolUtils {
public void execcuteTask(Runnable runnable) {
try {
threadPoolExecutor.submit(runnable);
}catch (Exception ex) {
log.error("任务处理错误");
}
}
private BlockingQueue<Runnable> queue;
private ThreadPoolExecutor threadPoolExecutor;
@PostConstruct
public void init() {
queue = new ArrayBlockingQueue(10);
threadPoolExecutor = new ThreadPoolExecutor(10, 20,
100, TimeUnit.MILLISECONDS, queue, new CustomRejectedExecutionHandler(20));
}
public int getQueueSize() {
return this.queue.size();
}
}
@Slf4j
public class CustomRejectedExecutionHandler implements RejectedExecutionHandler {
private int queueSize;
public CustomRejectedExecutionHandler(int queueSize) {
this.queueSize = queueSize;
}
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
log.info("线程池提交任务失败--->");
}
}
多线程任务处理类为:
@Scope("prototype")
public class TaskTwoTask implements Runnable{
@Resource
private ServiceTwoImpl serviceTwoImpl;
@Override
public void run() {
this.serviceTwoImpl.doTaskTwo();
}
}
具体的处理类如下:
@Slf4j
@Service
public class ServiceTwoImpl {
public void doTaskTwo(){
log.info("执行任务二");
}
}
上面就是简单的示例代码,将阿里巴巴开源书籍的代码应用具体的项目中,提升整个系统的运行效率。自己也在不断地学习
多线程相关的知识,有好的建议的小伙伴欢迎留言讨论。