采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送请求.1.服务端
package sterning;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.*;
import java.util.concurrent.*;
public class MultiThreadServer {
private int port=8821;
private ServerSocket serverSocket;
private ExecutorService executorService;//线程池
private final int POOL_SIZE=10;//单个CPU线程池大小
public MultiThreadServer() throws IOException{
serverSocket=new ServerSocket(port);
//Runtime的availableProcessor()方法返回当前系统的CPU数目.
executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE);
System.out.println("服务器启动");
}
public void service(){
while(true){
Socket socket=null;
try {
//接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接
socket=serverSocket.accept();
executorService.execute(new Handler(socket));
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws IOException {
new MultiThreadServer().service();
}
}
class Handler implements Runnable{
private Socket socket;
public Handler(Socket socket){
this.socket=socket;
}
private PrintWriter getWriter(Socket socket) throws IOException{
OutputStream socketOut=socket.getOutputStream();
return new PrintWriter(socketOut,true);
}
private BufferedReader getReader(Socket socket) throws IOException{
InputStream socketIn=socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
}
public String echo(String msg){
return "echo:"+msg;
}
public void run(){
try {
System.out.println("New connection accepted "+socket.getInetAddress()+":"+socket.getPort());
BufferedReader br=getReader(socket);
PrintWriter pw=getWriter(socket);
String msg=null;
while((msg=br.readLine())!=null){
System.out.println(msg);
pw.println(echo(msg));
if(msg.equals("bye"))
break;
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(socket!=null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2.客户端
package sterning;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class MultiThreadClient {
public static void main(String[] args) {
int numTasks = 10;
ExecutorService exec = Executors.newCachedThreadPool();
for (int i = 0; i < numTasks; i++) {
exec.execute(createTask(i));
}
}
// 定义一个简单的任务
private static Runnable createTask(final int taskID) {
return new Runnable() {
private Socket socket = null;
private int port=8821;
public void run() {
System.out.println("Task " + taskID + ":start");
try {
socket = new Socket("localhost", port);
// 发送关闭命令
OutputStream socketOut = socket.getOutputStream();
socketOut.write("shutdown\r\n".getBytes());
// 接收服务器的反馈
BufferedReader br = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
String msg = null;
while ((msg = br.readLine()) != null)
System.out.println(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
};
}
}
从而实现了多个客户端向服务器端发送请求,服务器端采用多线程的方式来处理的情况
分享到:
相关推荐
3. keepAliveTime:闲置线程存活时间,表示线程池中闲置线程可以存活多长时间。 4. unit:时间单位,表示 keepAliveTime 的时间单位,可以是秒、毫秒、微秒等。 使用线程池在 Spring Boot 中 在 Spring Boot 中...
线程池管理和多线程上传是并发编程中的一个重要实践,特别是在大数据传输和网络服务中。在Java等编程语言中,线程池通过有效地管理和复用线程资源,避免了频繁创建和销毁线程带来的开销,提升了系统性能。下面将详细...
然而,多线程也带来了同步问题,如数据竞争和死锁,因此需要通过锁机制(如互斥量、信号量)和条件变量等工具进行有效控制,确保线程安全。 线程池模式是一种管理线程的技术,它预先创建了一组线程,当有新的任务...
`99koo_ThreadPro.gif`可能是一个关于线程控制的图形化示例,`2ccc.com.nfo`可能包含更详细的介绍或者相关教程链接,而`ThreadPro`可能是源代码或文档,用于展示如何在具体项目中实现多线程控制和线程池模型。...
在IT行业中,多线程和线程池是提高程序并发性能和资源管理的关键技术。尤其在Java编程领域,它们在大型系统和并发密集型应用中扮演着重要角色。本篇文章将详细探讨“常用多线程模板”以及“鱼刺类(Fork/Join框架)...
根据提供的文档标题、描述以及部分内容,我们可以总结出以下关于如何运用Java中的`concurrent.ExecutorService`线程池实现socket的TCP和UDP连接的关键知识点: ### 1. 理解Java中的`concurrent.ExecutorService` `...
Java线程池是一种高级的多线程处理框架,它是Java并发编程中非常重要的一个组件。线程池的原理和实现涉及到操作系统调度、内存管理和并发控制等多个方面。理解线程池的工作原理有助于优化程序性能,避免过度创建和...
这里提到的“多线程换IP源码(调用鱼刺线程池)”是一个程序,它利用多线程技术来实现IP地址的快速切换,并且这个过程调用了名为“鱼刺线程池”的组件。下面将详细解释这两个主要知识点。 **多线程** 多线程是一种...
1. **多线程设计**:在Java中,多线程是通过`Thread`类或实现`Runnable`接口来实现的。本案例采用实现`Runnable`接口的方式定义了`UploadThread`类,该类用于处理客户端上传文件的具体逻辑。 2. **文件读写操作**:...
Java多线程、并发以及线程池是Java编程中至关重要的概念,特别是在处理高并发、高性能的系统设计时。以下是对这些主题的详细说明: 1. **Java 程序中的多线程** - 多线程允许一个程序同时执行多个任务,提高程序...
在Java编程语言中,实现多线程文件传输是一种优化程序性能、提高系统资源利用率的有效方法。多线程允许我们同时处理多个任务,这对于大文件传输或需要并行处理的场景尤其有用。本篇文章将深入探讨如何使用Java实现多...
在Java中,线程池是通过`java.util.concurrent`包中的`ExecutorService`接口及其实现类来实现的,如`ThreadPoolExecutor`。下面我们将深入探讨线程池的工作原理、核心参数以及如何在实际开发中使用线程池。 线程池...
本教程将深入讲解如何在Android环境中实现多线程下载功能,以及涉及的相关知识点。 首先,我们需要理解Android的线程模型。Android系统的主要UI线程(也称为主线程)负责处理用户交互和界面更新。为了不影响用户...
在多线程-Socket 编程中,使用 ExecutorService 来实现线程池可以提高服务器端的性能。ExecutorService 可以将任务提交给线程池,线程池中的线程将执行任务,从而提高服务器端的并发处理能力。 在示例代码中,使用...
线程池是Java多线程编程中的一个重要概念,它是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池可以有效地控制运行的线程数量,当线程空闲时,会进行回收,这样可以减少...
线程池是Java中一种高效的线程管理机制,它的出现是为了优化线程的创建和销毁过程,以提高系统的响应速度并合理利用系统资源。...理解线程池的实现原理和使用方式,对于开发高效、稳定的多线程应用至关重要。
在Java中,线程池的实现主要依赖于`java.util.concurrent`包中的`ExecutorService`接口及其相关的类,特别是`ThreadPoolExecutor`和`Executors`工厂类。`tcp_thread_java.zip`这个压缩包包含的示例代码展示了如何...
Thread类是最基础的线程实现方式,而ExecutorService则提供了更高级的线程池管理,可以更好地控制线程的并发数量,防止过度消耗系统资源。 为了分别跟踪每个文件的下载进度,我们可以使用Android的ProgressBar组件...
在Java中,`java.util.concurrent`包提供了`ExecutorService`接口及其实现,如`ThreadPoolExecutor`,来创建和管理线程池。 线程池的工作原理是通过维护一个工作线程集合,当提交任务时,线程池会从队列中选择一个...