阿里巴巴-《码出高效》-任务队列实际应用

  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("执行任务二");

    }

}

上面就是简单的示例代码,将阿里巴巴开源书籍的代码应用具体的项目中,提升整个系统的运行效率。自己也在不断地学习

多线程相关的知识,有好的建议的小伙伴欢迎留言讨论。

posted @ 2022-09-25 12:38  一只爱阅读的程序员  阅读(98)  评论(0编辑  收藏  举报