`
xmong
  • 浏览: 258455 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java多线程设计模式之队列通信

阅读更多
Java实现多线程处理队列请求通信:客户端线程向请求队列中不断发生请求,服务器端线程不断处理请求队列中请求。
一个线程(ClientThread)对另一线程(ServerThread)传递请求(request)的实例。实现简单的线程沟通。
设计如下:
Request:请求类,存储请求信息的类。
RequestQueue:请求队列类,接受存储请求的队列类。
ClientThread:发送请求的线程类,负责向请求队列中发送请求。
ServerThread:处理请求的线程类,负责向请求队列中取请求处理。
Mian:程序入口

Request:请求类,存储发生信息的类。

package com.single.queue;

/**
 * 
 * @author Administrator
 * 请求类
 */
public class Request {

	/**
	 * 请求名称
	 */
	private final String name;
	
	public Request(String name){
		this.name = name;
	}
	
	public String getName(){
		return name;
	}
	
	public String toString(){
		return "{Request."+name+"}";
	}
	
}

Request类中只存放了请求的名字信息。


RequestQueue:请求队列,用例存放请求的队列类。

package com.single.queue;

import java.util.LinkedList;

/**
 * 
 * @author Administrator
 *	请求队列
 */
public class RequestQueue {

	/**
	 * 请求队列
	 */
	private final LinkedList<Request> queue = new LinkedList<Request>();
	
	/**
	 * 同步取出队列中的请求
	 * @return
	 */
	public synchronized Request getRequest(){
		while(queue.size()<=0){
			try {
				System.out.println("{getRequest wait}");
				wait(); //如果队列为空,则当前线程进入等待池中
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		Request request = queue.removeFirst();
		System.out.println(Thread.currentThread().getName()+" getRequest "+request);
		return request;
	}
	
	/**
	 * 同步向队列中加入请求
	 * @param request
	 */
	public synchronized void putRequest(Request request){
		queue.addLast(request);
		System.out.println(Thread.currentThread().getName()+" putRequest "+request);
		notifyAll(); //队列中加入请求后,换醒等待线程处理请求
	}
	
}

RequestQueue类用来存放请求的类,这个类拥有putRequest和getRequest两个方法;
putRequest方法是实现将请求(request)存放到请求队列中(requestQueue),客户端线程会调用此方法来发生请求并保持到请求队列中。
getRequest方法是实现将请求(request)从请求队列中(requestQueue)中取出,服务器端线程就会调用此方法将请求队列中的请求取出并处理。

ClientThread:客户端线程,发送请求的线程类。

package com.single.queue;

import java.util.Random;

/**
 * 
 * @author Administrator
 *	客户端线程负责发送请求
 */
public class ClientThread extends Thread{

	/**
	 * 请求队列
	 */
	private RequestQueue requestQueue;
	/**
	 * client名称
	 */
	private String name;
	
	public ClientThread(String name, RequestQueue queue){
		super("client."+name);
		this.name = name;
		this.requestQueue = queue;
	}
	
	/**
	 * 循环加入多个请求
	 */
	public void run(){
		for (int i = 0; i < 10; i++) {
			Request request = new Request(name+"."+i);
			requestQueue.putRequest(request);
			try {
				Thread.sleep(new Random().nextInt(1010));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
		}
	}
	
}


ServerThread:服务器端线程,处理请求的线程类

package com.single.queue;

import java.util.Random;

/**
 * 
 * @author Administrator
 *	服务线程负责处理请求
 */
public class ServerThread extends Thread{

	/**
	 * 请求队列
	 */
	private RequestQueue requestQueue;
	
	public ServerThread(String name,RequestQueue queue){
		super("server."+name);
		this.requestQueue = queue;
	}
	
	/**
	 * 循环取出请求
	 */
	public void run(){
		for (int i = 0; i < 10; i++) {
			requestQueue.getRequest();
			try {
				Thread.sleep(new Random().nextInt(1000));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
		}
	}
	
}



Main:main程序执行入口

package com.single.queue;

/**
 * 
 * @author Administrator
 *	main
 */
public class Main {

	/**
	 * 客户端线程请求向队列中不断发送请求,服务器端线程不断处理请求。
	 * @param args
	 */
	public static void main(String[] args) {
		RequestQueue queue = new RequestQueue();
		new ClientThread("a",queue).start();
		new ServerThread("a",queue).start();
	}
	
}

执行结果:

client.a putRequest {Request.a.0}
server.a getRequest {Request.a.0}
client.a putRequest {Request.a.1}
server.a getRequest {Request.a.1}
{getRequest wait}
client.a putRequest {Request.a.2}
server.a getRequest {Request.a.2}
client.a putRequest {Request.a.3}
server.a getRequest {Request.a.3}
{getRequest wait}
client.a putRequest {Request.a.4}
server.a getRequest {Request.a.4}
{getRequest wait}
client.a putRequest {Request.a.5}
server.a getRequest {Request.a.5}
{getRequest wait}
client.a putRequest {Request.a.6}
server.a getRequest {Request.a.6}
client.a putRequest {Request.a.7}
client.a putRequest {Request.a.8}
server.a getRequest {Request.a.7}
server.a getRequest {Request.a.8}
{getRequest wait}
client.a putRequest {Request.a.9}
server.a getRequest {Request.a.9}



上面了列子只是一个单线程与单线程通信的列子,如果我们想要看多个线程与多个线程通信,则只需要修改main方法就可以实现:

public static void main(String[] args) {
		RequestQueue queue = new RequestQueue();
		new ClientThread("a",queue).start();
		new ServerThread("a",queue).start();
		new ClientThread("b",queue).start();
		new ServerThread("b",queue).start();
	}


修改后的执行结果如下:

client.a putRequest {Request.a.0}
client.b putRequest {Request.b.0}
server.a getRequest {Request.a.0}
server.b getRequest {Request.b.0}
{getRequest wait}
client.a putRequest {Request.a.1}
server.a getRequest {Request.a.1}
client.b putRequest {Request.b.1}
server.a getRequest {Request.b.1}
{getRequest wait}
client.a putRequest {Request.a.2}
server.b getRequest {Request.a.2}
{getRequest wait}
{getRequest wait}
client.b putRequest {Request.b.2}
server.a getRequest {Request.b.2}
{getRequest wait}
{getRequest wait}
client.b putRequest {Request.b.3}
server.a getRequest {Request.b.3}
{getRequest wait}
{getRequest wait}
client.a putRequest {Request.a.3}
server.a getRequest {Request.a.3}
{getRequest wait}
client.a putRequest {Request.a.4}
server.b getRequest {Request.a.4}
client.b putRequest {Request.b.4}
server.b getRequest {Request.b.4}
client.a putRequest {Request.a.5}
client.a putRequest {Request.a.6}
server.a getRequest {Request.a.5}
……




分享到:
评论

相关推荐

    一款分布式的java游戏服务器框架,具备高性能、可伸缩、分布式、多线程等特点,java 8 +gradle 4.0

    多线程设计,注解方式配置,轻松管理所有消息流 强大的RPC功能,调用远程RPC近似于调用本地函数,无需手工定义内部协议 支持插件功能,轻松实现功能插件 框架基于netty设计,轻松定义外部协议 简单的策划配置管理,...

    JAVA上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    JAVA上百实例源码以及开源项目源代码

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    Java开发基于多线程和NIO实现聊天室源码+项目说明(含服务端+客户端).zip

    Java开发基于多线程和NIO实现聊天室源码+项目说明(含服务端+客户端).zip 涉及到的技术点 - 线程池ThreadPoolExecutor - 阻塞队列BlockingQueue,生产者消费者模式 - Selector - Channel - ByteBuffer - ...

    Java并发编程原理与实战

    了解多线程所带来的安全风险.mp4 从线程的优先级看饥饿问题.mp4 从Java字节码的角度看线程安全性问题.mp4 synchronized保证线程安全的原理(理论层面).mp4 synchronized保证线程安全的原理(jvm层面).mp4 单例问题...

    毕业设计电商网站源码-JAVA-:JAVA-

    多线程 Java IO 与 NIO Java虚拟机(jvm) 设计模式 :open_file_folder: 数据结构与算法 数据结构 算法 :laptop: 计算机网络与数据通信 网络相关 数据通信(RESTful、RPC、消息队列) :mobile_phone: 操作系统 Linux...

    龙果java并发编程完整视频

    第43节Future设计模式实现(实现类似于JDK提供的Future)00:19:20分钟 | 第44节Future源码解读00:29:22分钟 | 第45节Fork/Join框架详解00:28:09分钟 | 第46节同步容器与并发容器00:18:44分钟 | 第47节并发容器...

    JAVA 范例大全 光盘 资源

    实例133 碰撞的球(多线程) 382 实例134 钟表(多线程) 387 实例135 模拟生产者与消费者 392 实例136 仿迅雷下载文件 396 第15章 图形编程 403 实例137 多变的按钮 403 实例138 自制对话框 405 实例139 ...

    经历BAT面试后总结的【高级Java后台开发面试指南】,纯净干货无废话,针对高频面试点

    多线程 IO 问题排查 Web框架、数据库 Spring MySQL Redis 通用基础 操作系统 网络通信协议 排序算法 常用设计模式 从URL到看到网页的过程 分布式 CAP理论 锁 事务 消息队列 协调器 ID生成方式 一致性hash 限流 ...

    Java JDK实例宝典

    7 一个支持多线程的服务器框架 13. 8 代理服务器 13. 9 Telnet客户端 13. 10 UDP编程 13. 11 聊天室服务器端 13. 12 聊天室客户端 13. 13 FTP客户端 第14章 数据库 14. 1 连接各种...

    龙果 java并发编程原理实战

    第43节Future设计模式实现(实现类似于JDK提供的Future)00:19:20分钟 | 第44节Future源码解读00:29:22分钟 | 第45节Fork/Join框架详解00:28:09分钟 | 第46节同步容器与并发容器00:18:44分钟 | 第47节并发容器...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第二阶段41讲、多线程设计模式内容回顾与总结.mp4 │ 高并发编程第二阶段42讲、ClassLoader课程大纲介绍.mp4 │ 高并发编程第二阶段43讲、类加载的过程以及类主动使用的六种情况详细介绍.mp4 │ 高...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第二阶段41讲、多线程设计模式内容回顾与总结.mp4 │ 高并发编程第二阶段42讲、ClassLoader课程大纲介绍.mp4 │ 高并发编程第二阶段43讲、类加载的过程以及类主动使用的六种情况详细介绍.mp4 │ 高...

    java8源码-javaGuide:java面试整理

    多线程类别知识重构 Netty 总结(---正在进行中---) 数据结构总结重构(---正在进行中---) 说明 JavaGuide介绍 对于 Java 初学者来说: 本文档倾向于给你提供一个比较详细的学习路径,让你对于Java整体的知识体系有一...

    java范例开发大全源代码

     8.3 面向对象的设计模式 241  实例156 Singleton单例模式 242  实例157 招聘(简单工厂模式) 243  实例158 同学聚会(工厂方法模式) 244  实例159 图书展(抽象工厂模式) 246  实例160 汽车...

    java8源码-javaGuide:【Java学习】一份涵盖大部分Java程序员所需要掌握的核心知识。https://javaguide.cn

    多线程类别知识重构 Netty 总结(---正在进行中---) 数据结构总结重构(---正在进行中---) 说明 JavaGuide介绍 对于 Java 初学者来说: 本文档倾向于给你提供一个比较详细的学习路径,让你对于Java整体的知识体系有一...

    百度地图毕业设计源码-java-core:核心

    多线程 Java IO 与 NIO Java虚拟机(jvm) 设计模式 :open_file_folder: 数据结构与算法 数据结构 算法 :laptop: 计算机网络与数据通信 网络相关 数据通信(RESTful、RPC、消息队列) :mobile_phone: 操作系统 Linux...

    java范例开发大全

    8.3 面向对象的设计模式 241 实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会(工厂方法模式) 244 实例159 图书展(抽象工厂模式) 246 实例160 汽车适配器(Adapter适配器模式...

Global site tag (gtag.js) - Google Analytics