首页 > 其他分享 >阿里巴巴-《码出高效》-任务队列实际应用

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

时间:2022-09-25 12:44:04浏览次数:47  
标签:阿里巴巴 队列 void private class 任务 码出 public

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

    }

}

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

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

标签:阿里巴巴,队列,void,private,class,任务,码出,public
From: https://www.cnblogs.com/yilangcode/p/16727652.html

相关文章

  • JS执行队列
    JS执行队列同步和异步同步前一个任务结束后再执行后一个任务,程序的执行顺序与任务的排列顺序是一致的、同步的。比如做饭的同步做法:我们要烧水煮饭,等水开了(10分......
  • 队列的模拟及环形队列思路
    定义队列是一个有序列表,可以用数组或是链表来实现。遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出模拟思路队列本身是有序列表,若使用数组的......
  • 简单的队列转发服务器
    废话不说先上代码#项目是转发服务器,针对新手fromtypingimportOptionalfromflaskimportFlask,requestimportredis,queue,time,requestsapp=Flask(__na......
  • BM42 用两个栈实现队列
    描述用两个栈来实现一个队列,使用n个元素来完成n次在队列尾部插入整数(push)和n次在队列头部删除整数(pop)的功能。队列中的元素为int类型。保证操作合法,即保证pop操......
  • MQ 消息队列时如何确保消息不丢失
    面试官在面试候选人时,如果发现候选人的简历中写了在项目中使用了MQ技术(如Kafka、RabbitMQ、RocketMQ),基本都会抛出一个问题:在使用MQ的时候,怎么确保消息100%不丢......
  • 数组模拟环形队列
    简介对前面的数组模拟队列的优化,充分利用数组.因此将数组看做是一个环形的。(通过取模的方式来实现即可)代码实现importjava.util.Scanner;publicclassCir......
  • 拆解一下任务队列、消息队列、任务调度系统
    最近调研了下任务调度系统中间件,包括xxl-job、elastic-job等,发现跟任务队列有一些类似的能力,比如通过API(事件)触发任务执行。随即想到,能否用任务调度系统覆盖任务队列的场......
  • 队列
    简介队列是一个有序列表,可以用数组或是链表来实现。遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出队列本身是有序列表,若使用数组的结构来存储......
  • 消息队列MQ核心原理全面总结(11大必会原理)
    消息队列已经逐渐成为分布式应用场景、内部通信、以及秒杀等高并发业务场景的核心手段,它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能。无论是Rabbi......
  • 阿里巴巴Java开发手册(终极版) pdf
    高清扫描版下载链接:https://pan.baidu.com/s/1H40dGfVJkJdmVHeiLLuIjw点击这里获取提取码 ......