服务端:
public class MultiServerPool {
private ServerSocket serverSocket;
private ExecutorService pool;// 线程池
private final int POOL_SIZE = 10;// 单个CPU线程池大小
public void service() {
try {
serverSocket = new ServerSocket(2046);
// Runtime的availableProcessor()方法返回当前系统的CPU数目.
pool = Executors.newFixedThreadPool(Runtime.getRuntime().
availableProcessors() * POOL_SIZE);
System.out.println("服务器启动...");
while (true) {
Socket socket = serverSocket.accept();
pool.execute(new Handler(socket));
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new MultiServerPool().service();
}
}
class Handler implements Runnable {
private Socket socket;
private BufferedReader is;
private PrintWriter os;
public Handler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
is = new BufferedReader(new InputStreamReader(socket.getInputStream()));
os = new PrintWriter(socket.getOutputStream());
String msg = is.readLine();
if (msg.equals("1")) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("客户端说:" + msg);
os.println("服务端收到消息:" + msg);
os.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (os != null) {
os.close();
}
if (is != null) {
is.close();
}
if (socket != null) {
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
客户端:
public class MultiClient {
private static Runnable service(final int i) {
return new Runnable() {
private Socket socket = null;
BufferedReader in = null;
PrintWriter out = null;
@Override
public void run() {
try {
socket = new Socket("localhost", 2046);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream());
out.println(i);
out.flush();
System.out.println(in.readLine());
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
};
}
public static void main(String[] args) {
Thread t1 = new Thread(service(1));
Thread t2 = new Thread(service(2));
t1.start();
t2.start();
}
}
分享到:
相关推荐
在Java中,`java.util.concurrent`包提供了`ExecutorService`、`ThreadPoolExecutor`等类来管理线程池。线程池预先创建一定数量的线程,当有任务提交时,线程池会从已存在的线程中选择一个执行,而不是每次都创建新...
本篇文章将深入讲解如何在Socket服务端实现线程池,以及其在实际项目中的应用。 首先,我们来看`SocketServer.java`。这个文件通常包含了服务器端的主逻辑,其中包括了服务器的启动、监听客户端连接和创建线程池来...
Socket线程池是一种高效管理网络连接的技术,它结合了Socket通信和线程池的设计思想,以提高系统的并发处理能力和资源利用率。在Java等编程语言中,我们常常利用线程池来处理大量的并发Socket连接,避免频繁创建和...
- 在Java中,可以使用`ExecutorService`创建一个线程池,然后为每个客户端连接创建一个Runnable或Callable任务,任务中包含Socket通信逻辑,如读写数据、解析协议等。 - 当Socket连接建立后,将任务提交到线程池...
Java中的Socket线程池是一种高效的网络编程模型,它结合了Socket通信和多线程技术,以提高服务端处理客户端请求的并发性能。对于初学者来说,理解并掌握这个概念至关重要,因为这能帮助他们构建更稳定、可扩展的网络...
ExecutorService是一个线程池接口,它继承了Executor接口,并提供了一些用于任务提交与执行管理的扩展方法。 在代码中,首先创建了一个ServerSocket对象,它监听特定端口(本例中为8000)。然后使用ExecutorService...
在Java中,ExecutorService和ThreadPoolExecutor是实现线程池的主要接口和类。 三、线程池的优势 1. 提高性能:线程池减少了创建和销毁线程的开销,因为线程可以被重复使用。 2. 控制并发量:通过设置最大线程数,...
Java服务器端的Socket线程池是一种优化服务器性能和资源管理的重要技术。在高并发场景下,服务器需要处理大量客户端的连接请求,而每个Socket连接通常会对应一个单独的线程来处理I/O操作。如果不加以控制,服务器...
6. 基于线程池的TCP服务器:如何利用Java的ExecutorService创建高效的多线程服务器,处理并发连接。 7. Socket通信中的死锁问题:分析由于read返回值导致的死锁情况,并提供解决方案。 8. Java NIO Socket:对比标准...
在实际开发中,我们可能会使用Java的`java.util.concurrent`包中的`ExecutorService`来创建线程池,利用`ThreadPoolExecutor`类来定制线程池参数。对于Socket操作,可以使用`java.net.Socket`类,而对于字节报文的...
运用JAVA的concurrent.ExecutorService线程池实现socket的TCP和UDP连接
在处理Socket连接时,尤其是TCP和UDP通信,`ExecutorService`可以帮助我们有效地利用系统资源,通过创建线程池来处理多个客户端连接,避免频繁地创建和销毁线程带来的开销。 在TCP连接中,`ServerSocket`是Java网络...
因此,采用线程池来优化Socket并发通信是常见的解决方案。 线程池是一种多线程编程中的管理策略,它允许预先创建一定数量的线程,然后根据需要从池中获取线程进行任务处理,完成后归还给线程池,而不是直接销毁。...
Java多线程Socket实现是网络编程中的重要概念,它结合了Java的并发处理能力和Socket通信技术,用于构建高效、可扩展的网络应用。Socket在计算机网络中起到桥梁的作用,允许两个远程应用程序通过TCP/IP进行数据交换。...
在多线程-Socket 编程中,使用 ExecutorService 来实现线程池可以提高服务器端的性能。ExecutorService 可以将任务提交给线程池,线程池中的线程将执行任务,从而提高服务器端的并发处理能力。 在示例代码中,使用...
Socket编程和线程池是两种在IT领域中至关重要的技术,尤其在开发网络应用程序和优化系统性能时。本文将深入探讨这两个主题,并结合提供的资源进行分析。 首先,Socket编程是计算机网络通信的基础,它允许两个远程...
线程池是Java并发处理的重要工具,它主要由`java.util.concurrent`包中的`ExecutorService`接口和相关的类实现。线程池可以有效地管理多个并发任务,避免频繁地创建和销毁线程带来的开销。在聊天室中,线程池可以...
// 创建一个线程池 ExecutorService executor = Executors.newFixedThreadPool(1); // 文件传输任务 Runnable fileTransferTask = () -> { long fileSize = new File("localFile").length(); long sentBytes = 0;...
在本学习笔记中,我们将探讨如何使用Java的Socket编程实现多线程服务器,特别是通过ExecutorService创建线程池来处理客户端的并发请求。ExecutorService是一个高级的线程管理工具,它允许我们更有效地管理和控制线程...