Java多线程——线程间消息队列的实现

JDK中有很多的阻塞的队列(Queue),这些队列可能是任务队列,可能是消息队列。

java线程间的消息队列:指的是消息在多线程之间的生产和消费的。

package com.leolee.multithreadProgramming.concurrent.messageQueue;

import lombok.extern.slf4j.Slf4j;

import java.util.LinkedList;

/**
 * @ClassName Test
 * @Description: 消息队列模式:java的线程之间通信的消息队列
 * JDK中各种阻塞队列就是使用的是该模式
 * @Author LeoLee
 * @Date 2020/12/6
 * @Version V1.0
 **/
@Slf4j
public class Test {

    public static void test() {
        MesssageQueue messsageQueue = new MesssageQueue(2);

        for (int i = 0; i < 3; i++) {
            int n = i;
            new Thread(() -> {
                messsageQueue.put(new Message(n, "值" + n));
            }, "生产者" + i).start();
        }

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(() -> {
            while (true) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                messsageQueue.take();
            }
        }, "消费者").start();
    }

    public static void main(String[] args) {
        Test.test();
    }
}

@Slf4j
class MesssageQueue {

    //使用有序的链表来充当队列
    private LinkedList<Message> list = new LinkedList<>();

    //队列容量
    private int capacity;

    public MesssageQueue(int capacity) {
        this.capacity = capacity;
    }

    //获取消息
    public Message take() {
        //检查消息队列是否为空
        synchronized (list) {
            while (list.isEmpty()) {
                log.info("当前队列为空,消费者线程等待");
                try {
                    list.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //从头部取出消息并返回
            Message message = list.removeFirst();
            //同时通知所有等待存入的线程(但是实际上是唤醒所有的线程,包括等待获取消息的线程)
            log.info("消息被消费");
            list.notifyAll();
            return message;
        }
    }

    //存入消息
    public void put(Message message) {
        synchronized (list) {
            //检查队列是否已经满了
            while (list.size() == capacity) {
                log.info("当前队列已满,生产者线程等待");
                try {
                    list.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //消息加入队列的尾部
            list.add(message);
            log.info("消息被放入队列,{}", message.toString());
            //通知所有等待获取消息的线程(但是实际上是唤醒所有的线程,包括等待存在的线程)
            list.notifyAll();
        }
    }

}

@Slf4j
final class Message {

    private int id;
    private Object value;

    public Message(int id, Object value) {
        this.id = id;
        this.value = value;
    }

    public int getId() {
        return id;
    }

    public Object getValue() {
        return value;
    }

    @Override
    public String toString() {
        return "Message{" +
                "id=" + id +
                ", value=" + value +
                '}';
    }
}

执行结果:
18:59:25.082 [生产者0] INFO com.leolee.multithreadProgramming.concurrent.messageQueue.MesssageQueue - 消息被放入队列,Message{id=0, value=值0}
18:59:25.100 [生产者1] INFO com.leolee.multithreadProgramming.concurrent.messageQueue.MesssageQueue - 消息被放入队列,Message{id=1, value=值1}
18:59:25.101 [生产者2] INFO com.leolee.multithreadProgramming.concurrent.messageQueue.MesssageQueue - 当前队列已满,生产者线程等待
18:59:27.083 [消费者] INFO com.leolee.multithreadProgramming.concurrent.messageQueue.MesssageQueue - 消息被消费
18:59:27.083 [生产者2] INFO com.leolee.multithreadProgramming.concurrent.messageQueue.MesssageQueue - 消息被放入队列,Message{id=2, value=值2}
18:59:28.085 [消费者] INFO com.leolee.multithreadProgramming.concurrent.messageQueue.MesssageQueue - 消息被消费
18:59:29.085 [消费者] INFO com.leolee.multithreadProgramming.concurrent.messageQueue.MesssageQueue - 消息被消费
18:59:30.095 [消费者] INFO com.leolee.multithreadProgramming.concurrent.messageQueue.MesssageQueue - 当前队列为空,消费者线程等待

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java全能学习面试手册——Java面试题库.zip 01 7道消息队列ActiveMQ面试题!.pdf 02 10道Java高级必备的Netty面试题!.pdf 03 10道Java面试必备的设计模式面试题!.pdf 04 10个Java经典的List面试题!.pdf 05 10个Java经典的Main方法面试题!.pdf 06 10个Java经典的String面试题!.pdf 07 15道经典的Tomcat面试题!.pdf 08 15道面试常问的Java多线程面试题!.pdf 09 17道消息队列Kafka面试题!.pdf 10 18道非常牛逼的Nginx面试题!.pdf 11 20道顶尖的Spring Boot面试题!.pdf 12 20道面试官常问的JVM面试题!.pdf 13 22道面试常问的SpringMVC面试题!.pdf 14 24道经典的英语面试题!.pdf 15 24道消息队列RabbitMQ面试题!.pdf 16 27道顶尖的Java多线程、锁、内存模型面试题!.pdf 17 29道常见的Spring面试题!.pdf 18 30个Java经典的集合面试题!.pdf 19 36道面试常问的MyBatis面试题!.pdf 20 40道常问的Java多线程面试题!.pdf 21 55道BAT精选的Mysql面试题!.pdf 22 60道必备的Java核心技术面试题!.pdf 23 70道阿里巴巴高级Java面试题!.pdf 24 ActiveMQ消息中件面试专题.pdf 25 Dubbo服务框架面试题及答案.pdf 26 Dubbo面试.pdf 27 Dubbo面试题.pdf 28 Dubbo面试专题.pdf 29 Java 面试题经典 77 问!.pdf 30 Java架构课程MCA大纲.pdf 31 Java就业班体系结构大纲.pdf 32 java面试题_多线程(68题).pdf 33 java面试题_设计模式(26题).pdf 34 java面试题_微服务--dubbo(41题).pdf 35 java面试题_消息中件--RabbitMQ(20题).pdf 36 java面试题_消息中件--RocketMq(14题).pdf 37 JVM.pdf 38 JVM常见面试题指南.pdf 39 JVM面试题.pdf 40 JVM面试专题.pdf 41 JVM性能优化相关问题.pdf 42 JVM执行子系统.pdf 43 Kafka面试题.pdf 44 Linux面试题.pdf 45 Linux面试专题.pdf 46 MongoDB面试题.pdf 47 MongoDB面试专题.pdf 48 Mybatis面试题(含答案)_.pdf 49 MyBatis面试题.pdf 50 MyBatis面试专题.pdf 51 MySQL55题答案.pdf 52 MySQL面试题(含答案)_.pdf 53 mysql面试题.pdf 54 mysql面试专题.pdf 55 MySQL性能优化的21个最佳实践.pdf 56 Netty面试题.pdf 57 Netty面试专题.pdf 58 Nginx面试题.pdf 59 Nginx面试专题.pdf 60 Nginx实战书籍.pdf 61 RabbitMQ消息中件面试专题.pdf 62 Redis面试题(二).pdf 63 Redis面试题(含答案)_.pdf 64 Redis面试题.pdf 65 Redis面试专题(二).pdf 66 Redis面试专题.pdf 67 Redis实战.pdf 68 SpringBoot面试专题.pdf 69 SpringCloud面试专题.pdf 70 SpringMVC面试专题.pdf 71 Spring面试题(含答案)_.pdf 72 Spring面试专题及答案.pdf 73 Spring源码深度解析.pdf 74 Tomcat架构解析文档.pdf 75 Tomcat架构解析文档.pdf.baiduyun.downloading 76 Tomcat面试专题.pdf 77 Tomcat优化相关问题.pdf 78 Zookeeper+分布式过程.pdf 79 zookeeper面试专题.pdf 80 并发编程面试专题.pdf 81 并发面试题.pdf 82 多线程,高并发.pdf 83 多线程面试59题(含答案)_.pdf 84 分布式缓存 Redis + Memcached 经典面试题!.pdf 85 搞定 HR 面试的 40 个必备问题!.pdf 86 集合框架.pdf 87 精选7道Elastic Search面试题!.pdf 88 精选8道Dubbo面试题!.pdf 89 精选17道海量数量处理面试题!.pdf 90 看透Spring
Java全能学习面试手册——Java架构师进阶资料面试资料.zip 01 7道消息队列ActiveMQ面试题!.pdf 02 10道Java高级必备的Netty面试题!.pdf 03 10道Java面试必备的设计模式面试题!.pdf 04 10个Java经典的List面试题!.pdf 05 10个Java经典的Main方法面试题!.pdf 06 10个Java经典的String面试题!.pdf 07 15道经典的Tomcat面试题!.pdf 08 15道面试常问的Java多线程面试题!.pdf 09 17道消息队列Kafka面试题!.pdf 10 18道非常牛逼的Nginx面试题!.pdf 11 20道顶尖的Spring Boot面试题!.pdf 12 20道面试官常问的JVM面试题!.pdf 13 22道面试常问的SpringMVC面试题!.pdf 14 24道经典的英语面试题!.pdf 15 24道消息队列RabbitMQ面试题!.pdf 16 27道顶尖的Java多线程、锁、内存模型面试题!.pdf 17 29道常见的Spring面试题!.pdf 18 30个Java经典的集合面试题!.pdf 19 36道面试常问的MyBatis面试题!.pdf 20 40道常问的Java多线程面试题!.pdf 21 55道BAT精选的Mysql面试题!.pdf 22 60道必备的Java核心技术面试题!.pdf 23 70道阿里巴巴高级Java面试题!.pdf 24 Java 面试题经典 77 问!.pdf 25 分布式缓存 Redis + Memcached 经典面试题!.pdf 26 搞定 HR 面试的 40 个必备问题!.pdf 27 精选7道Elastic Search面试题!.pdf 28 精选8道Dubbo面试题!.pdf 29 精选17道海量数量处理面试题!.pdf 30 史上最全40道Dubbo面试题!.pdf 31 史上最全50道Redis面试题!.pdf 32 史上最全70道Spring面试题!.pdf
Android实现多线程的几种方式有以下几种方法。首先,可以使用Java的Thread类来创建和管理线程。这种方式需要手动创建线程对象,并在run()方法中编写线程的逻辑。其次,可以使用Java的Runnable接口来实现多线程。这种方式需要创建一个实现了Runnable接口的类,并将其作为参数传递给Thread类的构造函数。然后,可以使用Handler类来实现多线程。通过Handler的post()或postDelayed()方法,可以将任务添加到主线程消息队列中,从而在主线程中执行异步操作。此外,还可以使用AsyncTask类来实现多线程。AsyncTask是Android提供的一个封装好的线程池,可以方便地在后台执行耗时操作,并在主线程中更新UI。通过重写AsyncTask的doInBackground()方法来执行耗时操作,并通过onPostExecute()方法来更新UI。需要注意的是,AsyncTask必须在主线程中创建实例,并且execute()方法也必须在主线程中调用。另外,Android 3.0之后,可以使用executeOnExecutor()方法来实现并发执行多个AsyncTask任务。总结起来,Android实现多线程的几种方式包括使用Thread类、Runnable接口、Handler类和AsyncTask类。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [Android——多线程的多种实现方式](https://blog.csdn.net/abliudede/article/details/104891324)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Android开发中四种常用的多线程实现方式](https://blog.csdn.net/star_nwe/article/details/130140238)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值