`
j0hnny
  • 浏览: 2752 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

(转)Socket+线程池(ExecutorService)

阅读更多
服务端:
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();
	}
}
分享到:
评论

相关推荐

    面向Socket基于线程池技术的java聊天室程序下载(含源代码)

    在Java中,`java.util.concurrent`包提供了`ExecutorService`、`ThreadPoolExecutor`等类来管理线程池。线程池预先创建一定数量的线程,当有任务提交时,线程池会从已存在的线程中选择一个执行,而不是每次都创建新...

    socket 线程池实现(已经在项目中应用)

    本篇文章将深入讲解如何在Socket服务端实现线程池,以及其在实际项目中的应用。 首先,我们来看`SocketServer.java`。这个文件通常包含了服务器端的主逻辑,其中包括了服务器的启动、监听客户端连接和创建线程池来...

    socket 线程池实现

    Socket线程池是一种高效管理网络连接的技术,它结合了Socket通信和线程池的设计思想,以提高系统的并发处理能力和资源利用率。在Java等编程语言中,我们常常利用线程池来处理大量的并发Socket连接,避免频繁创建和...

    线程池+socket

    - 在Java中,可以使用`ExecutorService`创建一个线程池,然后为每个客户端连接创建一个Runnable或Callable任务,任务中包含Socket通信逻辑,如读写数据、解析协议等。 - 当Socket连接建立后,将任务提交到线程池...

    JAVA 写的SOCKET线程池

    Java中的Socket线程池是一种高效的网络编程模型,它结合了Socket通信和多线程技术,以提高服务端处理客户端请求的并发性能。对于初学者来说,理解并掌握这个概念至关重要,因为这能帮助他们构建更稳定、可扩展的网络...

    java socket线程池

    ExecutorService是一个线程池接口,它继承了Executor接口,并提供了一些用于任务提交与执行管理的扩展方法。 在代码中,首先创建了一个ServerSocket对象,它监听特定端口(本例中为8000)。然后使用ExecutorService...

    Socket网络编程学习笔记之---使用线程池提高性能

    在Java中,ExecutorService和ThreadPoolExecutor是实现线程池的主要接口和类。 三、线程池的优势 1. 提高性能:线程池减少了创建和销毁线程的开销,因为线程可以被重复使用。 2. 控制并发量:通过设置最大线程数,...

    java服务器端Socket线程池

    Java服务器端的Socket线程池是一种优化服务器性能和资源管理的重要技术。在高并发场景下,服务器需要处理大量客户端的连接请求,而每个Socket连接通常会对应一个单独的线程来处理I/O操作。如果不加以控制,服务器...

    Java+TCP%2FIP+Socket+编程+-+v1.01

    6. 基于线程池的TCP服务器:如何利用Java的ExecutorService创建高效的多线程服务器,处理并发连接。 7. Socket通信中的死锁问题:分析由于read返回值导致的死锁情况,并提供解决方案。 8. Java NIO Socket:对比标准...

    简单实用,线程池+socket收发数据+解析字节格式报文

    在实际开发中,我们可能会使用Java的`java.util.concurrent`包中的`ExecutorService`来创建线程池,利用`ThreadPoolExecutor`类来定制线程池参数。对于Socket操作,可以使用`java.net.Socket`类,而对于字节报文的...

    运用JAVA的concurrent.ExecutorService线程池实现socket的TCP和UDP连接JAVA语言

    运用JAVA的concurrent.ExecutorService线程池实现socket的TCP和UDP连接

    运用JAVA的concurrent.ExecutorService线程池实现socket的TCP和UDP连接.doc

    在处理Socket连接时,尤其是TCP和UDP通信,`ExecutorService`可以帮助我们有效地利用系统资源,通过创建线程池来处理多个客户端连接,避免频繁地创建和销毁线程带来的开销。 在TCP连接中,`ServerSocket`是Java网络...

    Socket通讯解决并发采用线程池

    因此,采用线程池来优化Socket并发通信是常见的解决方案。 线程池是一种多线程编程中的管理策略,它允许预先创建一定数量的线程,然后根据需要从池中获取线程进行任务处理,完成后归还给线程池,而不是直接销毁。...

    java多线程Socket简单实现

    Java多线程Socket实现是网络编程中的重要概念,它结合了Java的并发处理能力和Socket通信技术,用于构建高效、可扩展的网络应用。Socket在计算机网络中起到桥梁的作用,允许两个远程应用程序通过TCP/IP进行数据交换。...

    Java多线程-Socket编程

    在多线程-Socket 编程中,使用 ExecutorService 来实现线程池可以提高服务器端的性能。ExecutorService 可以将任务提交给线程池,线程池中的线程将执行任务,从而提高服务器端的并发处理能力。 在示例代码中,使用...

    Socket Programming & Thread Pool实例

    Socket编程和线程池是两种在IT领域中至关重要的技术,尤其在开发网络应用程序和优化系统性能时。本文将深入探讨这两个主题,并结合提供的资源进行分析。 首先,Socket编程是计算机网络通信的基础,它允许两个远程...

    java聊天室,利用线程池实现多用户聊天室

    线程池是Java并发处理的重要工具,它主要由`java.util.concurrent`包中的`ExecutorService`接口和相关的类实现。线程池可以有效地管理多个并发任务,避免频繁地创建和销毁线程带来的开销。在聊天室中,线程池可以...

    Java socket 传文件

    // 创建一个线程池 ExecutorService executor = Executors.newFixedThreadPool(1); // 文件传输任务 Runnable fileTransferTask = () -> { long fileSize = new File("localFile").length(); long sentBytes = 0;...

    学习笔记:多线程Java Socket编程示例

    在本学习笔记中,我们将探讨如何使用Java的Socket编程实现多线程服务器,特别是通过ExecutorService创建线程池来处理客户端的并发请求。ExecutorService是一个高级的线程管理工具,它允许我们更有效地管理和控制线程...

Global site tag (gtag.js) - Google Analytics