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

java多线程设计模式之线程池处理请求

阅读更多
Java实现线程池处理请求:

客户端线程发出请求,请求存入请求队列中,服务器端线程池不断从请求列表中拿出请求,执行请求。服务器端用线程池实现多线程处理请求,线程实例在使用的时候已经被创建,直接使用实例,提供程序的执行效率。

设计如下:
Request:请求类,存储请求信息,携带请求的执行方法。
RequestQueue:存储请求队列类,负责保存请求的存储和取出。
ClientThread:客户端线程类,负责发送请求。
ServerThread:服务端线程类,负责获取请求并执行请求。
ServerThreadPool:服务端线程池类,负责初始化线程数,管理线程。
Main:main类。

实现如下:

Request:请求类
package com.thread.pool;

import java.util.Random;

/**
 * 请求类
 * @author Administrator
 * 
 */
public class Request {
	
	/**
	 * 请求名称
	 */
	private final String name;
	
	private final Random random = new Random();
	
	public Request(String name){
		this.name = name;
	}
	
	public String getName(){
		return name;
	}
	
	/**
	 * 请求执行方法
	 */
	public void execute(){
		System.out.println(Thread.currentThread().getName()+" execute "+getName());
		try {
			Thread.sleep(random.nextInt(3000));//摸拟执行时间
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	public String toString(){
		return "{"+name+"}";
	}
	
	
}

RequestQueue:请求队列类,负责存储请求。

package com.thread.pool;

import java.util.LinkedList;

/**
 * 请求队列类
 * @author Administrator
 *
 */
public class RequestQueue {
	
        //存储请求列表
	private LinkedList<Request> requests = new LinkedList<Request>();
	//请求列表大小
	private int size;
	
	public RequestQueue(int size){
		this.size = size;
	};
	
	/**
	 * 添加请求
	 * @param request
	 */
	public synchronized void putRequest(Request request){
		
		while(requests.size() > size){//判断请求队列中是否达到队列容量
			try {
				System.out.println(Thread.currentThread().getName()+" {putRequest wait}");
				wait();//添加线程等待
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		requests.addLast(request);//添加请求
		System.out.println(Thread.currentThread().getName()+" putRequest "+request);
		notifyAll();//唤醒其他等待线程
	};
	
	
	/**
	 * 获取请求
	 * @return
	 */
	public synchronized Request getRequest(){
		
		while(requests.size() <= 0){//判断是否队列中是否存在请求
			try {
				System.out.println(Thread.currentThread().getName()+" {getRequest wait}");
				wait();//消费线程等待
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		Request request = requests.removeFirst();//取出请求
		System.out.println(Thread.currentThread().getName()+" getRequest "+request);
		notifyAll();//唤醒其他线程
		return request;
	};
	
	
}


ClientThread:客户端线程类,负责发生请求

package com.thread.pool;

import java.util.Random;

/**
 * 客户端线程类
 * @author Administrator
 *
 */
public class ClientThread extends Thread{
	
	//请求队列
	private RequestQueue requestQueue;
	private Random random = new Random();
	
	public ClientThread(String name, RequestQueue queue){
		super(name);
		this.requestQueue = queue;
	}
	
	/**
	 * 循环产生请求
	 */
	public void run(){
		int count = 0;
		while(true){
			Request request = new Request("request."+count+"."+this.getName());
			requestQueue.putRequest(request);//添加请求
			count++;
			try {
				Thread.sleep(random.nextInt(1000));//随机休息
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}

ServerThread:服务端线程类,负责获取请求执行请求。

package com.thread.pool;

/**
 * 服务端线程类
 * @author Administrator
 *
 */
public class ServerThread  extends  Thread{
	
	//请求队列
	private RequestQueue requestQueue;
	
	public ServerThread(String name, RequestQueue requestQueue){
		super(name);
		this.requestQueue = requestQueue;
	}

	/**
	 * 获取请求处理请求
	 */
	public void run (){
		while (true) {
			Request request = requestQueue.getRequest();//获取队列中的请求
			request.execute();//执行请求方法
		}
	}
	
	
}

ServerThreadPool:服务端线程池,初始化线程,管理服务线程。

package com.thread.pool;

/**
 * 服务端线程池
 * @author Administrator
 *
 */
public class ServerThreadPool {

	//存储线程数组
	private ServerThread[] serverThreads;
	//请求队列
	private RequestQueue requestQueue;
	
	/**
	 * 线程池构造方法
	 * @param queue 队列
	 * @param size 线程池大小
	 */
	public ServerThreadPool(RequestQueue queue, int size) {
		this.requestQueue = queue;
		//初始化线程池
		this.serverThreads = new ServerThread[size];
		for (int i = 0; i < size; i++) {
			serverThreads[i] = new ServerThread("ServerThread."+i, requestQueue);
		}
	}
	
	/**
	 * 循环启动线程池中的线程
	 */
	public void start(){
		for (int i = 0; i < serverThreads.length; i++) {
			serverThreads[i].start();
		}
	}
	
	
	
}

Main:mian类。

package com.thread.pool;

/**
 * main类
 * @author Administrator
 *
 */
public class Main {
	
	public static void main(String[] args) {
		//创建队列
		RequestQueue queue = new RequestQueue(3);
		//创建线程池
		ServerThreadPool pool = new ServerThreadPool(queue, 5);
		//启动客户端线程发送请求
		new ClientThread("ClientThread.A", queue).start();
		new ClientThread("ClientThread.B", queue).start();
		//启动线程池处理请求
		pool.start();
		
	}

}


执行结果:

ClientThread.A putRequest {request.0.ClientThread.A}
ClientThread.B putRequest {request.0.ClientThread.B}
ServerThread.1 getRequest {request.0.ClientThread.A}
ServerThread.1 execute request.0.ClientThread.A
ServerThread.0 getRequest {request.0.ClientThread.B}
ServerThread.3 {getRequest wait}
ServerThread.0 execute request.0.ClientThread.B
ServerThread.2 {getRequest wait}
ServerThread.4 {getRequest wait}
ServerThread.0 {getRequest wait}
ClientThread.A putRequest {request.1.ClientThread.A}
ServerThread.0 getRequest {request.1.ClientThread.A}
ServerThread.0 execute request.1.ClientThread.A
ServerThread.4 {getRequest wait}
ServerThread.2 {getRequest wait}
ServerThread.3 {getRequest wait}
ClientThread.B putRequest {request.1.ClientThread.B}
ServerThread.3 getRequest {request.1.ClientThread.B}
ServerThread.3 execute request.1.ClientThread.B
ServerThread.2 {getRequest wait}
ServerThread.4 {getRequest wait}
ClientThread.A putRequest {request.2.ClientThread.A}
ServerThread.4 getRequest {request.2.ClientThread.A}
ServerThread.4 execute request.2.ClientThread.A
ServerThread.2 {getRequest wait}
ClientThread.B putRequest {request.2.ClientThread.B}
ServerThread.2 getRequest {request.2.ClientThread.B}
ServerThread.2 execute request.2.ClientThread.B
ClientThread.B putRequest {request.3.ClientThread.B}
ClientThread.A putRequest {request.3.ClientThread.A}
ClientThread.B putRequest {request.4.ClientThread.B}
ClientThread.A putRequest {request.4.ClientThread.A}
ServerThread.1 getRequest {request.3.ClientThread.B}
ServerThread.1 execute request.3.ClientThread.B
ServerThread.3 getRequest {request.3.ClientThread.A}
ServerThread.3 execute request.3.ClientThread.A
ServerThread.4 getRequest {request.4.ClientThread.B}
ServerThread.4 execute request.4.ClientThread.B
ClientThread.A putRequest {request.5.ClientThread.A}
ClientThread.B putRequest {request.5.ClientThread.B}
ClientThread.B putRequest {request.6.ClientThread.B}
ClientThread.A {putRequest wait}
ServerThread.2 getRequest {request.4.ClientThread.A}
ServerThread.2 execute request.4.ClientThread.A
ClientThread.A putRequest {request.6.ClientThread.A}

。。。。




分享到:
评论

相关推荐

    Java基础知识点总结.docx

    十二、 多线程★★★★ 39 为什么要使用多线程 39 创建线程和启动 39 线程的生命周期 44 线程管理 45 线程同步 49 线程通信 52 线程池 58 死锁 64 线程相关类 65 十三、 同步★★★★★ 67 十四、 Lock接口 70 十五...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    │ │ 9.JAVA并发编程之多线程并发同步业务场景与解决方案.wmv │ │ │ ├─10.微服务架构之Spring Cloud Eureka 场景分析与实战 │ │ 10.微服务架构之Spring Cloud Eureka 场景分析与实战.wmv │ │ │ ├─11....

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

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

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【多线程】Java四种线程池的创建方法 83 【多线程】线程池原理和运行机制 83 【多线程】线程池对任务的处理 85 【多线程】线程池的状态 86 线程池的状态说明 86 各个状态之间的转换 86 【多线程】什么是线程池?如果...

    Java并发编程(学习笔记).xmind

    (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 (2)建模简单:通过使用线程可以讲复杂并且异步的工作流进一步分解成一组简单并且同步的工作流,每个工作流在一个单独的线程...

    Java常见面试题208道.docx

    面试题包括以下十九部分:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql...

    JAVA面试题最全集

    谈谈java多线程 23.谈谈文件加密技术 24.软件开发生命周期 25.路由协议种类及特点 26.java的awt和swing组件的GUI设计的关键 27.对于java流的认识 28.简单描述一下awt与swing区别。 29.简述java编程中事件处理...

    java范例开发大全源代码

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

    java范例开发大全

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

    Java范例开发大全 (源程序)

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

    java微信公众号MVC开发框架

    jwx是开源的java公众号开发MVC框架,基于spring配置文件和微信消息或事件注解,通过微信上下文处理一个或多个微信公众号服务请求。目的主要有两个,其一生封装微信请求xml消息为java实体对象,将返回对象转换为xml...

    史上最全java面试,103项重点知识,带目录

    三、多线程 13 35. 并行和并发有什么区别? 13 36. 线程和进程的区别? 14 37. 守护线程是什么? 14 38. 创建线程有哪几种方式? 14 39. 说一下 runnable 和 callable 有什么区别? 15 40. 线程有哪些状态? 15 41. ...

    java范例开发大全(pdf&源码)

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

    Java范例开发大全(全书源程序)

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

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例143 使用线程池优化多线程编程 186 实例144 Object类中线程相关的方法 187 实例145 哲学家就餐问题 189 实例146 使用信号量实现线程同步 190 实例147 使用原子变量实现线程同步 191 实例148 使用事件分配线程...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--多线程之线程池ExecutorService |--字体为粗体 |--安卓下的多线程断点上传 |--对话框与进度条结合用法 |--屏幕之Activity全屏 |--屏幕之横竖屏切换 |--屏幕之调节屏幕亮度 |--屏幕相关之Display类获取屏幕尺寸和...

    java代码雨源码-rain-workload-toolkit:Rain是一个基于统计的工作负载生成工具包,它使用参数化和经验分布来模拟不同类

    两个线程池,一个包含基于在实验期间模拟的最大客户端/用户数量的专用加载线程和一个(可能更小)用于模拟异步操作执行的共享线程池 请求生成与请求执行分离如果需要或可行,此设计选择允许 Rain 生成可由合适的第三...

Global site tag (gtag.js) - Google Analytics