`

Java 时间服务器demo之线程池

    博客分类:
  • java
阅读更多

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.csdn.net/caicongyang

 

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

 

 

 

 



分享到:
评论

相关推荐

    轻量级java多线程池demo

    在Java编程中,多线程是并发处理任务的关键技术,它可以极大地提高程序的执行效率,尤其是在服务器端应用中。本文将深入探讨一个轻量级的Java多线程池实现,这个实现允许线程间的通信,并提供了类似Akka Actor的调度...

    java常用工具类封装

    Java高级客户端提供了与Elasticsearch服务器通信的能力,支持复杂的查询、索引和聚合操作。它比基于HTTP的RestHighLevelClient更强大,能够更好地处理网络异常和序列化问题,同时提供了更丰富的API来操作数据。 3. ...

    Java Netty基于对象数据传输Demo

    服务器端会创建一个`ServerBootstrap`,配置线程池、通道工厂、管道等,然后绑定一个端口开始监听。客户端使用`Bootstrap`,配置好对应的参数,连接到服务器。在服务器和客户端的管道中,都需要添加`ObjectDecoder`...

    java 第三方短信接口 demo及文档

    10. **性能优化**:在高并发场景下,可能需要考虑使用线程池批量发送短信,避免因大量请求而对服务器造成过大压力。 以上就是关于“java 第三方短信接口 demo及文档”的核心知识点。通过理解和实践这些步骤,开发者...

    Java 服务器和多客户端之间的建议通讯 demo

    本示例“Java服务器和多客户端之间的建议通讯 demo”聚焦于如何利用Java实现一个简单的服务器,它能同时处理多个客户端的连接请求,这在多人在线游戏、实时聊天应用或者分布式系统中是非常常见的场景。我们将深入...

    http服务器demo

    对于POST请求,服务器需要解析请求体中的数据,并可能需要执行一些业务逻辑,如存储数据到数据库。 在Delphi中,可以使用 Indy(Internet Direct) 或 Synapse 这样的库来简化HTTP服务器的开发。Indy 是一个功能...

    基于NIO非阻塞的java聊天demo(支持单聊和群聊)

    此外,这个demo可能还包含了线程池管理,用于处理客户端的请求,以及心跳机制,保持连接的活跃性。心跳机制通常是由客户端定时向服务器发送空消息,服务器接收到后回复确认,以此判断连接是否正常。 总之,这个基于...

    netty客户端与服务器信息交互demo

    在服务器端,你需要创建一个ServerBootstrap实例,配置所需的参数,如线程池、套接字选项等。然后,通过bind方法指定监听的端口,启动服务器。服务器的Pipeline通常会包含一个ByteToMessageDecoder,用于将接收到的...

    java多人聊天客户端和服务器端

    本项目是一个基于Java实现的多人聊天系统,它包括客户端(ClientDemo.java)和服务器端两部分,旨在提供一个实时、互动的通信平台,允许多个用户通过网络进行对话交流。这个系统的核心在于利用Java的Socket编程来...

    grpc-server-demo:grpc服务器演示

    在这个“grpc-server-demo”项目中,我们将深入理解如何使用Java实现gRPC服务器。 1. **gRPC基础概念** - **RPC**:RPC允许一个程序调用另一个不在同一台机器上的程序,就像调用本地函数一样简单。 - **ProtoBuf*...

    android 线程池 handler异步刷新 双缓存

    在Android中,我们通常使用`java.util.concurrent`包下的`ExecutorService`和`ThreadPoolExecutor`来创建线程池。线程池可以避免频繁创建和销毁线程带来的性能开销,提高系统资源的利用率。通过合理配置线程池的参数...

    quartzDemo任务调度例子

    在"quartzDemo任务调度例子"中,我们将探讨如何利用Quartz实现Java应用程序中的定时任务。 1. **Quartz简介** Quartz是Cron-like和Calendar-based任务调度库,用于在Java应用程序中安排和管理作业。它提供了丰富的...

    高并发多线程处理demo-java.rar

    在Java编程领域,高并发和多线程是关键的技术之一,尤其在服务器端应用和大数据处理中至关重要。这个"高并发多线程处理demo-java.rar"压缩包提供了一个实际的Java实现,展示了如何构建一个并发队列来接收数据,并...

    Java框架JSON-RPC项目demo代码实战

    在Java开发中,JSON-RPC框架可以帮助开发者实现客户端与服务器之间的高效通信,常用于分布式系统或者微服务架构。本项目实战主要基于JSON-RPC进行,我们将探讨如何使用Java实现一个简单的JSON-RPC服务端和客户端。 ...

    socket长连接 demo

    同时,服务器会有一个定时任务(例如使用Java的ScheduledExecutorService)来定期检查客户端列表,如果发现有超过预设时间未收到心跳包的客户端,就将其视为断开连接并从列表中移除。 在实现心跳机制时,我们需要...

    springMVC+reids+ 线程池+ibaits的demo做pv统计

    标题 "springMVC+redis+线程池+ibatis的demo做pv统计" 提供了关于一个基于Java Web开发的PV(Page View)统计系统的简要概述。这个系统结合了多个核心组件,包括Spring MVC作为MVC框架,Redis作为缓存数据库,线程池...

    java生产项目常用的demo.zip

    【标题】"java生产项目常用的demo.zip" 描述了这个压缩包的核心内容,它是一个集成了Java实际开发中常见示例的资源集合。这通常意味着它包含了一系列用于演示和学习Java编程语言在真实生产环境中的应用的代码示例。...

    java socket异步长连接demo

    Java Socket编程是网络编程的基础,尤其在实现服务器与客户端间通信时扮演着重要角色。"异步长连接"是Java Socket编程中一种高效且广泛使用的通信模式,它允许客户端和服务器保持连接状态,以便在需要时快速交换数据...

    微信小程序的后端Java Demo程序.zip

    后端Java Demo程序则是为微信小程序提供数据支持和服务的服务器端代码示例。这个压缩包“微信小程序的后端Java Demo程序.zip”包含了使用Java语言开发的微信小程序后端服务的源代码,我们可以从以下几个方面来理解和...

    Socket服务器+客户端Demo

    此时,服务器会在accept()方法调用后为每个新的客户端创建一个新的线程或使用线程池来处理,以保证服务的并发能力。 此外,对于网络编程,还需要了解TCP(传输控制协议)和UDP(用户数据报协议)。TCP是一种面向...

Global site tag (gtag.js) - Google Analytics