`

Java基础之线程阻塞、线程通信之消息队列

阅读更多

1、线程通信遇到的问题:线程阻塞

一个线程可以不必一直等待下去,而在请求结果没有获取到之前,不会有任何响应。


2、采用消息队列解决线程阻塞

在线程通信中常用到【消息队列】这种数据结构的设计模式。线程通信时,只需要向(处于另一个线程中的)消息队列中发送(或接收)消息,而不必一直等待对方是否响应。

在某些场景中,例如:android Activity 的主线程向子线程发送消息时,会将一个 callback() 方法一起发生过去。等子线程处理消息并结束时,会调用这个主线程中的callback() 方法。


3、什么是【队列】?

队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将是最后被删除的元素,因此队列又称为“先进先出”(FIFO—first in first out)的线性表。

java.util.Queue

在java5中新增加了java.util.Queue接口,用以支持队列的常见操作。该接口扩展了java.util.Collection接口。

值得注意的是LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。


4、java多线程消息队列的简单实现


import java.util.LinkedList;

public class MessageQueue {

    private LinkedList<Object> queue = null;

    public MessageQueue() {
        queue = new LinkedList<Object>();
    }

    public synchronized void send(Object o) {
        queue.addLast(o);
    }

    public synchronized Object receive() {
        if (queue.size() == 0)
            return null;
        Object o = queue.getFirst();
        queue.removeFirst();
        return o;
    }

}












引用:

http://www.cnblogs.com/linjiqin/archive/2013/05/30/3107656.html








-
转载请注明:
原文出处:http://lixh1986.iteye.com/blog/2338584









-


分享到:
评论

相关推荐

    java 多线程 队列工厂

    队列工厂则是实现多线程间通信和任务调度的一种设计模式,它提供了一种抽象和统一的方式来创建和管理队列实例。 ### 1. Java 多线程 多线程是指在单个程序中同时执行多个线程(任务)的能力。Java通过`Thread`类和...

    java线程聊天室(阻塞队列实现)

    【Java线程聊天室(阻塞队列实现)】 在Java编程中,多线程是构建并发应用程序的关键技术。在创建一个线程聊天室时,我们通常会涉及到多个线程之间的交互,例如用户发送消息、接收消息以及处理网络通信等。而阻塞...

    Java实现简单的阻塞队列2种方式

    在Java编程中,阻塞队列是一种特殊类型的并发数据结构,它在多线程环境中的应用广泛,主要用于线程间的协作通信。阻塞队列在队列满时会阻止生产者线程添加元素,在队列空时会阻止消费者线程取出元素,直到条件满足...

    java多线程加队列上传文件_后台处理

    通过以上分析可以看出,Java多线程加队列上传文件的实现不仅涉及基础的网络编程和文件操作知识,还需要掌握高级的多线程管理和并发控制技术。这种技术方案适用于需要高效处理大量文件上传请求的场景,比如云存储服务...

    实时接收发送消息(接收消息线程阻塞,发送消息线程唤醒)

    在标题和描述中提到的“实时接收发送消息(接收消息线程阻塞,发送消息线程唤醒)”是一个典型的并发编程问题,涉及到线程管理和通信。以下是对这个主题的详细讲解: 1. **线程与并发**: - 线程是程序执行的最小...

    Java使用阻塞队列控制线程通信的方法实例详解

    - 实战1展示了当队列满时,`put()`方法会导致生产者线程阻塞。在示例中,由于队列大小为2,前两个`bq.put("Java")`成功插入,第三个`bq.put("Java")`将阻塞生产者线程,导致"打印2"无法输出。 - 实战2中,去掉了会...

    java多线程解决消息压入栈和取出

    消息队列(Message Queue)是另一种常见的并发编程工具,它能有效地协调多个线程之间的通信。消息队列通常用于存储待处理的消息,一个线程负责生产消息,而其他线程则负责消费这些消息。在Java中,可以使用`java....

    消息分发框架(基于JAVA阻塞队列实现、 生产者消费者模型)

    基于Java的实现通常会利用阻塞队列(BlockingQueue)和生产者消费者模型来确保线程安全和高效率。在这个框架中,生产者负责生成任务或消息,而消费者则负责处理这些任务或消息。 ### Java 阻塞队列 Java阻塞队列是...

    linux使用消息队列实现进程间双向通信

    本文将深入探讨如何利用消息队列这一IPC机制实现进程间的双向通信。消息队列允许进程异步地发送和接收消息,提供了一种高效且灵活的数据交换方式。 消息队列是由内核管理的数据结构,它存储由进程发送的消息,并...

    java多线程经典案例

    本案例将深入探讨Java多线程中的关键知识点,包括线程同步、线程通信和线程阻塞。 线程同步是为了防止多个线程同时访问共享资源,导致数据不一致。Java提供了多种同步机制,如synchronized关键字、Lock接口...

    Java中使用阻塞队列控制线程集实例

    首先,阻塞队列是一种特殊类型的队列,它支持线程间的同步和通信。当队列为空时,尝试从中取元素的线程会被阻塞,直到有新的元素被添加;同样,当队列满时,尝试添加元素的线程也会被阻塞,直至队列中有空间可用。...

    Java使用starling分布式消息队列异步处理事务

    在Java中,使用Starling可以创建一个消息队列,生产者将任务封装成消息并放入队列,消费者则在后台线程中取出并执行这些任务,实现了任务的异步处理。 接下来,我们来看两个示例文件:SetQueueTest.java和...

    Java Design Demo -简单的队列

    描述中提到的“java android”表明这个示例可能特别针对Android环境下的Java开发,这意味着队列可能被用来解决Android应用中的特定问题,例如管理UI线程与后台任务之间的通信,或者实现高效的消息传递机制。...

    彻底明白Java的多线程-线程间的通信.doc

    在Java中,`BlockingQueue`是一种常用的线程间通信工具,它可以安全地存储和传递数据,同时提供线程间的阻塞等待机制。例如,生产者线程可以将数据放入队列,消费者线程从队列中取出数据。队列的满和空状态自动触发...

    Java多线程示例之线程控制

    Java提供了多种同步机制,如`synchronized`关键字、`wait()`, `notify()` 和 `notifyAll()` 方法,以及`java.util.concurrent`包中的高级工具,如`Semaphore`(信号量)和`BlockingQueue`(阻塞队列)。在读写操作中...

    java队列

    JMS允许应用程序通过消息队列进行异步通信。 8. **实际应用案例**:可能讨论了如何在实际项目中使用队列,例如在Web服务器中的请求处理、多线程任务调度、数据缓存更新等场景。 9. **源码分析**:博主可能深入分析...

    java学习(基于Java阻塞队列的搜索实例).pdf

    Java的并发API为我们提供了强大的线程间通信工具,而阻塞队列是这些工具中的核心组件之一。阻塞队列是一个支持两个附加操作的队列:在队列为空时,获取元素的线程会等待队列变为非空;如果队列为满,生产者线程会...

    线程的消息队列的代码资源

    1. 异步通信:发送线程将消息放入队列后立即返回,不会阻塞,提高了程序的执行效率。 2. 安全性:操作系统或编程语言提供的消息队列机制通常会包含锁或其他同步机制,确保在多线程环境下安全地访问消息队列。 3. ...

    java阻塞队列实现原理及实例解析.docx

    阻塞队列的核心特性在于其在队列为空或满时能够自动阻塞线程,从而实现线程间的同步和通信。这种机制使得生产者和消费者线程可以高效地协同工作,而无需显式地使用锁和条件变量。 在Java中,自Java 5.0起,`java....

    阻塞队列实现生产者消费者模式Java开发Java经验技巧共

    7. **集成 RocketMQ**:考虑到标签中有"rocketmqjava项目集成",可能还会介绍如何将阻塞队列与RocketMQ消息队列结合使用,提升系统的异步处理能力。 在实际的Java项目中,尤其是大型分布式系统中,阻塞队列是实现...

Global site tag (gtag.js) - Google Analytics