- 浏览: 458791 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (272)
- java基础 (59)
- struts (8)
- spring (8)
- 数据库 (8)
- java 网络编程 (29)
- hibernate (3)
- JavaScript (10)
- 日志管理 (2)
- jsp (4)
- servlet (7)
- xml (4)
- ajax (2)
- web service (4)
- 算法与数据结构 (13)
- java 反射机制 (11)
- java 泛型 (3)
- java I/O (8)
- java 线程 (12)
- JavaEE (6)
- java解惑 (33)
- 工具 (5)
- MyEclipse编程实践 (1)
- OSGI (2)
- 设计模式 (9)
- 正则表达式 (0)
- EJB (3)
- Ubuntu linux (6)
- Android (1)
- web前端 (2)
- 找工作 (1)
- SCA (1)
- maven (1)
- 缓存 (1)
- json (1)
- javamail (1)
- 工作笔记 (2)
最新评论
-
霜花似雪:
博主可以分享一下源码吗?
使用maven构建web项目实例 -
王庆波-行:
很好的demo!
memcache使用实例 -
surpassno:
大写的牛逼
java可视化显示内存使用情况 -
zhulin0504:
怎么访问NetEcho.html页面呀???
applet与servlet的网络通信 -
springdata:
java多线程实例demo源代码下载:http://www.z ...
java多线程例子
前面的程序,当一个客户端请求到来时,服务器端就会临时性的创建一个新的线程来处理相应的客户端请求,当一个线程处理完了相应的客户端的任务之后,这个线程也就结束了自己的生命周期,不能再次被启用。这样开销是很大的。
线程池主要用来解决线程生命周期开销问题和资源不足问题。通过对多个任务重用线程。一个简单的线程池至少包括线程池管理器,线程池,工作线程,任务接口等部分,线程池管理器是创建,销毁并管理线程池,将工作线程放入线程池中,线程池的作用是维护一个线程池实例,工作线程是一个可以循环执行任务的线程,在没有任务时进行等待,任务接口是每个任务必须实现的接口。
客户端和前面的没什么不同
主要给出服务器端程序及线程池管理器和线程池类
服务器端:
线程池管理类
线程池类
工作接口
工作类
线程池主要用来解决线程生命周期开销问题和资源不足问题。通过对多个任务重用线程。一个简单的线程池至少包括线程池管理器,线程池,工作线程,任务接口等部分,线程池管理器是创建,销毁并管理线程池,将工作线程放入线程池中,线程池的作用是维护一个线程池实例,工作线程是一个可以循环执行任务的线程,在没有任务时进行等待,任务接口是每个任务必须实现的接口。
客户端和前面的没什么不同
主要给出服务器端程序及线程池管理器和线程池类
服务器端:
package threadpool; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class PoolAdvanceServer { // 服务器端 public static int clientCount = 0; static int port = 8888; [b]ThreadPool threadPool = PoolManager.getInstance().createThreadPool(100, ServerWorker.class); [/b]//从线程管理器中取得线程池 public PoolAdvanceServer(){ } public static void main(String[] args) { //启动服务器端主程序 PoolAdvanceServer server = new PoolAdvanceServer(); try { server.listen(port); } catch (IOException e) { e.printStackTrace(); } } private void listen(int port) throws IOException { ServerSocket server = new ServerSocket(port); System.out.println("The PoolAdvanceServer is listening......"); while (true) { clientCount++; Socket socket = server.accept(); [b]threadPool.performWork(socket);[/b] } } }
线程池管理类
package threadpool; public class PoolManager { //线程池管理器,系统应保证只有一个实例,应用单例模式 private static PoolManager instance = null; // 构造函数为私有的,保证外部类不可以实例化该类 private PoolManager(){ } public static PoolManager getInstance(){ if(instance==null)instance = new PoolManager(); return instance; } //创建线程池实例方法 public ThreadPool createThreadPool(int max,Class worker){ ThreadPool threadPool = null; try { threadPool = new ThreadPool(max,worker); //创建线程池实例 } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return threadPool; } }
线程池类
package threadpool; import java.util.Stack; public class ThreadPool { /* * 任务处理类,该类被线程池调用 */ class WorkerThread extends Thread { private Worker _worker; private Object _data; /* * 任务处理类的构造函数 * * @param id 线程名称 * * @param worker 与该类关联的工作类 */ public WorkerThread(String id, Worker worker) { super(); _worker = worker; _data = null; } @Override synchronized public void run() { boolean stop = false; while (!stop) { if (_data == null) { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); continue; } } if (_data != null) { System.out.println(this.getName()); _worker.run(_data); } _data = null; stop = !(_push(this)); } } // 唤醒线程并作相应的处理工作 synchronized public void wake(Object data) { _data = data; notify(); } } private Stack _waiting; // 就绪线程栈 private int _max; // 最大线程数 private Class _workerClass; // 工作类 public ThreadPool(int max, Class workerClass) throws InstantiationException, IllegalAccessException { _max = max; _waiting = new Stack(); _workerClass = workerClass; Worker worker; WorkerThread w; for (int i = 0; i < _max; i++) { worker = (Worker) _workerClass.newInstance(); w = new WorkerThread("Worker#" + i, worker); w.start(); _waiting.push(w); // 进栈 } } // 将处理完任务的线程归还给线程池 public boolean _push(WorkerThread w) { boolean stayAround = false; synchronized (_waiting) { if (_waiting.size() < _max) { stayAround = true; _waiting.push(w); } } return stayAround; } public void performWork(Object data) { // 执行处理客户端请求的任务 WorkerThread w = null; synchronized (_waiting) { if (_waiting.empty()) { try { w = new WorkerThread("additional worker", (Worker) _workerClass.newInstance()); w.start(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } else { w = (WorkerThread) _waiting.pop(); } } w.wake(data); } }
工作接口
package threadpool; public interface Worker { public void run(Object data); }
工作类
package threadpool; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; public class ServerWorker implements Worker { @Override public void run(Object data) { //处理客户端请求方法 processRequest((Socket)data); } private void processRequest(Socket socket) { try { InputStream is = socket.getInputStream(); OutputStream os = socket.getOutputStream(); DataInputStream dis = new DataInputStream(is); DataOutputStream dos = new DataOutputStream(os); int receiveInt = dis.readInt(); // 读取客户端请求 System.out.println("The message from client"+PoolAdvanceServer.clientCount+" is:" + receiveInt); dos.writeInt(receiveInt * 18); // 返回client端 dos.flush(); // 强制清空缓冲区 dos.close(); dis.close(); is.close(); delay(10l); // 线程处理完毕后,减少client端的数量 PoolAdvanceServer.clientCount--; } catch (IOException e) { e.printStackTrace(); } } private void delay(long l) { try { Thread.sleep(l); } catch (InterruptedException e) { e.printStackTrace(); } } }
发表评论
-
计算机网络知识
2011-06-01 16:19 762一个http请求的详细过程 我们来看当我们在浏览器输入htt ... -
java udp socket实例
2010-12-06 12:28 7092客户端: package udp; import jav ... -
tcp socket实例(改进)
2010-12-01 16:16 1568上一篇的程序服务器端只能接受一个客户端请求,本篇改为模拟多客户 ... -
java tcp socket实例
2010-12-01 13:44 1597网络编程的基本模型就是客户端到服务器端模型,一段必须提供一个固 ... -
telnet协议(转)
2010-10-14 17:17 1111我们知道Telnet服务器软 ... -
whois协议(转)
2010-10-14 14:28 1335当我们预备建立一个Web站点,就必须向域名登记机构申请一个In ... -
java 网络协议(一)Tcp多线程服务器端编程
2010-10-14 11:33 54591,通用服务器代码: package multiThread; ... -
java 网络协议(一)UDP
2010-10-14 09:24 1435UDP测试程序,无需建立连接 package udp; ... -
java 网络协议(一)Tcp
2010-10-14 08:52 51071,简化的服务器端程序 package tcp; imp ... -
java 网络协议(一)InetAddress和Socket(含源码)
2010-10-14 08:24 18571,ip地址和主机名互换 package getip; ... -
ftp协议2(转)
2010-10-12 16:26 939FTP协议工作原理 FTP有 ... -
ftp协议(转)
2010-10-12 16:21 1236ftp协议 FTP协议将使用两 ... -
SMTP服务协议(转)
2010-10-11 15:31 1212SMTP服务概述 鉴于本课程的默认读者群是那些对Inter ... -
利用socket发送接收邮件(转)
2010-10-11 15:18 4154这是在网上摘的,执行接收邮件出现:530 Authentica ... -
jdk6.0从入门到精通-----chapter5网络编程 新I/O(含源码下载)
2010-09-21 10:13 1395本例向用户通过参数指定的主机端口发送一段请求报文,然后读取和打 ... -
jdk6.0从入门到精通-----chapter6--http
2010-09-14 16:32 910用httpconnection进行文件下载,建立一般的jav ... -
java自学===Filter类的应用,验证用户
2010-09-14 14:37 910Filter类 package com; import ... -
java自学===Filter类的应用,网站数量统计
2010-09-14 12:31 1908package filterStatistic; imp ... -
jdk6.0从入门到精通-----chapter5网络编程 udp套接字
2010-09-12 13:46 1129用到的主要类DatagramPacket,DatagramSo ... -
jdk6.0从入门到精通-----chapter5网络编程 tcp连接池
2010-09-10 18:07 957package pool; import java.ne ...
相关推荐
运用JAVA的concurrent.ExecutorService线程池实现socket的TCP和UDP连接
运用JAVA的concurrent.ExecutorService线程池实现socket的TCP和UDP连接.doc
建立TCP、UDP单播、组播 创建服务器端与客户端,服务器端使用select机制接收客户端的请求,并交给线程池处理
TCP SOCKET多线程通信,使用.NET自带线程池,高效率 ,可用来测试端口防火墙等,注释详细,
C#基于TCP的Socket多线程通信(包含服务端和客户端) 代码都有注释,方便新手阅读
C++语言实现的线程池,结合windowsIOCP完成端口,实现socket高并发服务端程序.zip
一套简单的推送机制。使用TCP长连接,完成服务器端往客户端推送消息的功能。为了加强服务器端的并发性,使用Java NIO+线程池的模式来实现服务器端的推送服务。
java TCP通信服务器端实现代码,采用线程池实现,可以支持多个请求并发
使用TCPServer编写(多线程)socket服务 http://blog.csdn.net/ghostfromheaven/article/details/8653421
一类是接收线程池,接收线程池获取每个socket传输来的数据包, 同时保证每个socket的包按照到来的顺序进行处理, 二类是工作线程池,由接收线程池把接收到的数据包投递到工作线程池, 工作线程池专门处理这些接收到...
主要讲解Java Socket编程中TCP服务端线程池的实例,希望能给大家做一个参考。
tcp/udp客户端,接口简单易用并且是线程安全的,用户不必关心具体的socket api操作。 tcp/udp服务器,使用非常简单,只要实现具体的tcp/udp会话(Session类)逻辑,使用模板的方式可以快速的构建高性能的服务器。 对...
Linux网络编程之TCP/IP基础篇 01TCPIP基础(一) ISO/OSI参考模型 ...40POSIX条件变量 条件变量 条件变量函数 条件变量使用规范 使用条件变量解决生产者消费者问题 41一个简单的线程池实现 线程池性能分析 线程池实现
Socket TCP通信传输文件的功能实现,在服务器端采用了多线程、线程池连接可保证服务器端同时连接多个客户端,服务器端在接收文件完成后会给客户端回传上传成功的消息并将收到文件进行随机命名以确保文件不会被重复...
支持配置TCP Keep Alive 参数。 支持Mono(Mono 2.10 或更新版本)。 提供内置的Flash/Silverlight策略服务器。 新增了多个命令程序集。 新增了更多的的QuickStart示例项目。 使用TPL处理多线程相关事务。 将...
这是我用API封装的,供调试Socket程序用的 有客户端和服务端 两个程序都是基于Select异步模型的,其中服务端还用到了多线程技术,保证了多客户端的连接 都是消息触发和回调的 用多线程就能够保证多客户端的同时连接,要...
3. 采用模拟 Proacto r的事件处理模式,利用线程池实现多线程机制,实现高并发通信,减少频繁创建和销毁线程带来的开销;(信号和互斥锁) 4. 主进程负责事件的读写,子线程负责业务逻辑——用有限状态机解析HTTP...
tcp/udp客户端,接口简单易用并且是线程安全的,用户不必关心具体的socket api操作。 tcp服务器,使用非常简单,只要实现具体的tcp会话(TcpSession类)逻辑,使用模板的方式可以快速的构建高性能的服务器。 对套接字...