- 浏览: 467893 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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 792一个http请求的详细过程 我们来看当我们在浏览器输入htt ... -
java udp socket实例
2010-12-06 12:28 7121客户端: package udp; import jav ... -
tcp socket实例(改进)
2010-12-01 16:16 1592上一篇的程序服务器端只能接受一个客户端请求,本篇改为模拟多客户 ... -
java tcp socket实例
2010-12-01 13:44 1625网络编程的基本模型就是客户端到服务器端模型,一段必须提供一个固 ... -
telnet协议(转)
2010-10-14 17:17 1139我们知道Telnet服务器软 ... -
whois协议(转)
2010-10-14 14:28 1361当我们预备建立一个Web站点,就必须向域名登记机构申请一个In ... -
java 网络协议(一)Tcp多线程服务器端编程
2010-10-14 11:33 54851,通用服务器代码: package multiThread; ... -
java 网络协议(一)UDP
2010-10-14 09:24 1476UDP测试程序,无需建立连接 package udp; ... -
java 网络协议(一)Tcp
2010-10-14 08:52 51371,简化的服务器端程序 package tcp; imp ... -
java 网络协议(一)InetAddress和Socket(含源码)
2010-10-14 08:24 18831,ip地址和主机名互换 package getip; ... -
ftp协议2(转)
2010-10-12 16:26 965FTP协议工作原理 FTP有 ... -
ftp协议(转)
2010-10-12 16:21 1266ftp协议 FTP协议将使用两 ... -
SMTP服务协议(转)
2010-10-11 15:31 1246SMTP服务概述 鉴于本课程的默认读者群是那些对Inter ... -
利用socket发送接收邮件(转)
2010-10-11 15:18 4190这是在网上摘的,执行接收邮件出现:530 Authentica ... -
jdk6.0从入门到精通-----chapter5网络编程 新I/O(含源码下载)
2010-09-21 10:13 1430本例向用户通过参数指定的主机端口发送一段请求报文,然后读取和打 ... -
jdk6.0从入门到精通-----chapter6--http
2010-09-14 16:32 945用httpconnection进行文件下载,建立一般的jav ... -
java自学===Filter类的应用,验证用户
2010-09-14 14:37 940Filter类 package com; import ... -
java自学===Filter类的应用,网站数量统计
2010-09-14 12:31 1940package filterStatistic; imp ... -
jdk6.0从入门到精通-----chapter5网络编程 udp套接字
2010-09-12 13:46 1162用到的主要类DatagramPacket,DatagramSo ... -
jdk6.0从入门到精通-----chapter5网络编程 tcp连接池
2010-09-10 18:07 984package pool; import java.ne ...
相关推荐
运用JAVA的concurrent.ExecutorService线程池实现socket的TCP和UDP连接
本篇文章将深入讲解如何在Socket服务端实现线程池,以及其在实际项目中的应用。 首先,我们来看`SocketServer.java`。这个文件通常包含了服务器端的主逻辑,其中包括了服务器的启动、监听客户端连接和创建线程池来...
总结起来,"TCPSOCKET线程池通信客户端+服务器端示例代码"是.NET开发者学习如何利用TCP SOCKET进行高效、多线程通信的宝贵资源。通过理解和实践这个示例,开发者可以更好地掌握网络编程技术,为开发高性能的网络应用...
在Java等编程语言中,Socket通常被用来实现TCP/IP协议,为应用程序提供低级别的网络通信服务。 线程池是多线程编程中的一个设计模式,它维护着一组可以复用的线程,而不是每次需要时就创建新的线程。这种方式减少了...
在本主题中,我们将深入探讨如何使用`select`机制和线程池来构建高效的TCP、UDP服务器,以及客户端的实现。 首先,TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,而UDP(用户数据报...
根据提供的文档标题、描述以及部分内容,我们可以总结出以下关于如何运用Java中的`concurrent.ExecutorService`线程池实现socket的TCP和UDP连接的关键知识点: ### 1. 理解Java中的`concurrent.ExecutorService` `...
本篇文章将深入探讨C#中基于TCP的Socket多线程通信,包括服务端和客户端的实现。 TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在C#中,我们可以使用System.Net....
- **Java中的Socket**:Java的`java.net.Socket`类实现了TCP Socket,`DatagramSocket`类实现了UDP Socket。 3. **线程池与Socket的结合**: - **应用背景**:在网络服务器编程中,通常会有很多并发的客户端连接...
在Linux环境下,使用socket API进行编程,可以实现TCP/IP协议栈的各种功能,包括TCP连接、UDP数据报文收发等。Socket编程涉及的主要函数有socket()用于创建套接字,bind()将套接字与本地地址关联,listen()设置...
在给定的代码示例中,`myserver.cpp` 和 `mytask.cpp` 可能包含了使用线程池处理TCP连接的实现,而对应的头文件 `myserver.h` 和 `mytask.h` 定义了相关类和接口。 `QTcpSocket` 是一个用于进行双向字节流通信的类...
压缩包文件"TCPSocket"可能包含了示例代码,这些代码可以帮助初学者更好地理解TCP Socket编程的实践。通过阅读和运行这些代码,你可以学习如何在Python、C++、Java等语言中实现TCP Socket客户端和服务端。 在编程...
在本文中,我们将深入探讨如何使用Visual Studio 2017在C++环境中实现TCP Socket的多线程同步。这个程序的关键在于理解TCP协议、套接字编程、多线程处理以及同步机制,特别是通过select函数和WSAEVENT事件对象。 ...
在Java中,ExecutorService和ThreadPoolExecutor是实现线程池的主要接口和类。 三、线程池的优势 1. 提高性能:线程池减少了创建和销毁线程的开销,因为线程可以被重复使用。 2. 控制并发量:通过设置最大线程数,...
在本项目"C++语言实现的线程池,结合windowsIOCP完成端口,实现socket高并发服务端程序.zip"中,我们关注的核心是利用C++编程语言构建一个高性能的、支持高并发的TCP服务器。线程池和Windows的IO Completion Ports...
本示例将深入讲解如何在QT中实现TCP Socket通信。 首先,TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。在TCP通信中,发送方和接收方需要先建立连接,然后才能进行...
在IT领域,网络通信是计算机系统之间交换信息的关键技术,而TCP(传输控制协议)与Socket接口是实现网络通信的基础。本项目“多线程实现基于TCP的Socket通信”聚焦于在Windows环境下,如何利用C++编程语言通过多线程...
本篇文章将深入探讨如何使用C++通过TCP Socket实现一个单进程单线程的高并发服务器。 首先,我们需要理解TCP Socket的基本概念。Socket是网络通信中的一个接口,它允许两个进程之间通过网络进行通信。在C++中,我们...
在IT行业中,网络通信是不可或缺的一部分,而TCP(Transmission Control Protocol)套接字(socket)则是实现网络通信的一种基础机制。TCP是一种面向连接的、可靠的传输协议,它保证了数据包在网络中的顺序传递和...
> 加入线程池公共组件:。1、加入 IHPThreadPool 线程池公共组件。2、IHPThreadPool 主要方法:。 1) Start:启动线程池。 2) Stop:关闭线程池。 3) Submit:提交任务。 4) AdjustThreadCount:调整线程池大小。> ...