美文网首页
多线程消费的模板代码

多线程消费的模板代码

作者: 小王ovo | 来源:发表于2023-07-19 11:45 被阅读0次
public class MessageDispatch {
    private final List<Worker> workers;
    private volatile boolean isWorker = true;

    /**
     * 构造函数初始化线程池
     */
    public MessageDispatch(int poolSize, int capacity) {
        this.workers = Collections.synchronizedList(new ArrayList<>());
        for (int i = 0; i < poolSize; i++) {
            //使用有界队列防止任务无限增长
            Worker worker = new Worker(new ArrayBlockingQueue<>(capacity), this);
            worker.start();
            workers.add(worker);
        }
    }

    public static class Worker extends Thread {
        private final MessageDispatch pool;
        private final BlockingQueue<Runnable> queue;

        public Worker(BlockingQueue<Runnable> queue, MessageDispatch pool) {
            this.queue = queue;
            this.pool = pool;
        }

        public Queue<Runnable> getQueue() {
            return queue;
        }

//        非阻塞的方式去取,会频繁的循环,忙等待
//        @Override
//        public void run() {
//            while (this.pool.isWorker || queue.size() > 0) {
//                Runnable task = queue.poll();
//                if (task != null) {
//                    task.run();
//                }
//            }
//        }

        @Override
        public void run() {
            Runnable task = null;
            while (this.pool.isWorker || !queue.isEmpty()) {
                try {
                    if (this.pool.isWorker) {
                        //工作中默认任务会不断到来,所以阻塞的方式获取,阻塞方式获取。
                        task = this.queue.take();
                    } else {
                        //工作结束,执行完剩下的任务再退出,非阻塞方式拿。
                        task = this.queue.poll();
                    }
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    e.printStackTrace();
                    break;
                }
                if (task != null) {
                    task.run();
                }
            }
        }
    }

    public boolean submit(String id, Runnable task) {
        int index = id.hashCode() % this.workers.size();
        Queue<Runnable> runnableQueue = this.workers.get(index).getQueue();
        return runnableQueue.add(task);
    }

    public void shutDown() {
        this.isWorker = false;
        for (Thread worker : workers) {
            if (worker.getState().equals(Thread.State.BLOCKED) || worker.getState().equals(Thread.State.WAITING)) {
                worker.interrupt();//强制中断这个线程
            }
        }
    }

    public static void main(String[] args) {
        MessageDispatch pool = new MessageDispatch(10, 100);

        List<Message> messages = new ArrayList<>();
        messages.add(new Message(0, "order init"));
        messages.add(new Message(0, "order pay"));
        messages.add(new Message(1, "order init"));
        messages.add(new Message(1, "order pay"));
        messages.add(new Message(2, "order init"));
        messages.add(new Message(2, "order pay"));

        for (Message msg : messages) {
            pool.submit(msg.getId().toString(), () -> System.out.println(msg.getId() + ":" + msg.getMessage()));
        }

        pool.shutDown();
    }
}

一种不好的写法

// 非阻塞的方式去取,会频繁的循环,忙等待
@Override
    public void run() {
        while (this.pool.isWorker || queue.size() > 0) {
            Runnable task = queue.poll();
            if (task != null) {
                task.run();
            }
        }
    }

相关文章

  • leetcode第1114题:按顺序打印

    题目描述 考点 多线程 代码实现 注意利用了c++标准模板库中:mutex库; 参考资料 c++之多线程中“锁”的...

  • JUC中线程之间得通信

    使用synchronized实现线程间通信,线程间通信:1、生产者+消费者2、通知等待唤醒机制.多线程编程模板:1...

  • RabbitMQ-中间件

    安装Erlang语言 安装RabbitMQ 模式 fanout模板代码 direct模板代码 topic模板代码

  • 多线程队列

    0x0 队列在多线程中的应用消息产生及消费一般在不同的线程,多线程需互斥访问队列。 0x1 代码实现一个队列负责消...

  • 05-Django模板

    一、模板概述 模板组成HTML代码动态插入的代码(挖坑、填坑逻辑控制代码) 作用快速生成HTML页面 优点模板的设...

  • 05-Django模板

    一、模板概述 模板组成HTML代码动态插入的代码(挖坑、填坑逻辑控制代码) 作用快速生成HTML页面 优点模板的设...

  • 2018-11-19UI自动化&参数化

    一、java学习 idea 实时代码模板 idea实时代码模板 创建模板组,模板https://www.tapd....

  • 2018-11-19

    一、java学习 idea 实时代码模板 idea实时代码模板 创建模板组,模板https://www.tapd....

  • 2018-11-20

    一、java学习 idea 实时代码模板 idea实时代码模板 创建模板组,模板https://www.tapd....

  • 小程序页面跳转地址配置

    模板代码: js代码:

网友评论

      本文标题:多线程消费的模板代码

      本文链接:https://www.haomeiwen.com/subject/zlgoudtx.html