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

本文详细介绍了Java实现线程池处理请求的过程,包括客户端线程如何将请求放入请求队列,服务器端线程池如何从队列中取出请求执行,以及线程池的初始化与管理。通过实例代码展示,帮助开发者理解并高效实现多线程处理请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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}

。。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值