Java 时间服务器demo之线程池

本文介绍了一个基于Java的简单IO线程池服务端实现,通过使用线程池来处理客户端请求,避免了为每个请求创建新线程导致资源消耗的问题。然而,该方案仍采用同步阻塞IO模型,在高并发场景下表现受限。

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

1.代码

服务端:

TimeServer.java

 

package com.ccy.IO.pools;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class TimeServer {
	public static void main(String[] args) throws IOException {
		int port = 8080;
		if(args!=null && args.length>0){
			port = Integer.valueOf(args[0]);
		}
		
		ServerSocket server =  null;
		try {
			server = new ServerSocket(port);
			Socket socket =null;
			TimeServerHandlerExecutePool pool = new TimeServerHandlerExecutePool(512, 1024);
			while(true){
				socket = server.accept();
				pool.excute(new TimeServerHandler(socket));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(server!=null){
				server.close();
				server = null;
			}
		}
	}
}

TimeServerHandlerExecutePool.java

 

package com.ccy.IO.pools;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class TimeServerHandlerExecutePool {
	private ExecutorService executor;
	
	public TimeServerHandlerExecutePool(int maxPoolSize,int queueSize){
		executor = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), maxPoolSize, 120L, TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(queueSize));
	}
	
	
	public void excute(java.lang.Runnable task){
		executor.execute(task);
	}
	
}

TimeServerHandler.java

 

package com.ccy.IO.pools;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.text.SimpleDateFormat;

public class TimeServerHandler implements Runnable{
	private Socket socket;
	
	public TimeServerHandler(Socket socket){
		this.socket = socket;
	}

	@Override
	public void run() {
		System.out.println("TIME SERVER IS LISTENING!!!");
		BufferedReader reader =null;
		PrintWriter writer = null;
		try {
			reader = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
			writer = new PrintWriter(this.socket.getOutputStream(),true);
			String msg =null;
			SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
			while(true){
				msg = reader.readLine();
				if(msg == null){
					break;
				}else{
					System.out.println("received msg is:"+msg);
					writer.println(format.format(new java.util.Date()));
				}
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(reader!=null){
				try {
					reader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				reader = null;
			}
			if(writer!=null){
				writer.close();
				writer = null;
			}
			if(this.socket != null){
				try {
					this.socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				this.socket = null;
			}
		}
	}

}


客户端:

TimeClient.java

 

package com.ccy.IO.pools;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class TimeClient {
	public static void main(String[] args) {
		Socket socket = null;
		PrintWriter writer = null;;
		BufferedReader reader = null;
		try {
			socket = new Socket("127.0.0.1", 8080);
			reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			writer = new PrintWriter(socket.getOutputStream(),true);
			writer.println("what time is it now?");
			String resp = reader.readLine();
			System.out.println("Now is:"+resp);
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(reader!=null){
				try {
					reader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				reader = null;
			}
			if(writer!=null){
				writer.close();
				writer = null;
			}
			if(socket != null){
				try {
					socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				socket = null;
			}
		}
	}
}

代码来自:李林峰《Netty权威指南》

2.分析:

 

采用线程池实现IO通信框架,避免了为每一个请求创建一个线程而造成的资源枯竭问题。但是依然采用IO同步阻塞模型,无法从根本上解决我们高并发,高性能的需求!

 

 

先模仿在创造吧!

更多精彩内容请继续关注我的博客:http://blog.youkuaiyun.com/caicongyang

 

记录与分享,你我共成长 -fromcaicongyang

 

 

 

 



Java Socket 和线程池结合可以构建高性能的服务端程序,以下是简单的示例概述: 首先,你需要创建一个Socket服务器,并使用`java.net.ServerSocket`监听特定端口。然后,当客户端连接时,启动一个新的线程池,每个线程代表一个客户端连接,可以使用`ExecutorService`或`ThreadPoolExecutor`来管理这些线程。 ```java import java.io.*; import java.net.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class SocketServer { private static final int PORT = 8080; private ExecutorService executor; public static void main(String[] args) throws IOException { new SocketServer().start(); } public void start() throws IOException { ServerSocket serverSocket = new ServerSocket(PORT); System.out.println("Server started on port " + PORT); executor = Executors.newFixedThreadPool(10); // 创建固定大小的线程池 while (true) { Socket clientSocket = serverSocket.accept(); // 等待新连接 executor.execute(new ClientHandler(clientSocket)); } } private class ClientHandler implements Runnable { private Socket clientSocket; public ClientHandler(Socket socket) { this.clientSocket = socket; } @Override public void run() { try { BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); PrintWriter writer = new PrintWriter(clientSocket.getOutputStream(), true); String requestLine; while ((requestLine = reader.readLine()) != null) { // 处理客户端发送的消息... writeResponse(writer, "Hello from server!"); // 发送响应 } clientSocket.close(); } catch (IOException e) { e.printStackTrace(); } } private void writeResponse(PrintWriter writer, String response) { try { writer.println(response); writer.flush(); } catch (IOException e) { e.printStackTrace(); } } } } ``` 在这个例子中,`ClientHandler`类负责处理客户端请求,每次有新的连接,都会创建一个新的线程来处理,而不会阻塞主线程。当所有客户端关闭连接后,`ExecutorService`会自动回收空闲的线程,维持服务器的高效运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值