接上上编著, 现在简单说说线程池服务端程序的实现。线程池服务端与多线程差不多,主要不同也是在于接收请求的循环:
......
protected ExecutorService threadPool = Executors.newFixedThreadPool(10);
......
while(! isStopped()){
Socket clientSocket = null;
try {
clientSocket = this.serverSocket.accept();
} catch (IOException e) {
if(isStopped()) {
System.out.println("Server Stopped.") ;
return;
}
throw new RuntimeException(
"Error accepting client connection", e);
}
this.threadPool.execute(
new WorkerRunnable(clientSocket, "Thread Pooled Server"));
}
......
public class WorkerRunnable implements Runnable{
protected Socket clientSocket = null;
protected String serverText = null;
public WorkerRunnable(Socket clientSocket, String serverText) {
this.clientSocket = clientSocket;
this.serverText = serverText;
}
public void run() {
try {
InputStream input = clientSocket.getInputStream();
OutputStream output = clientSocket.getOutputStream();
long time = System.currentTimeMillis();
output.write(("HTTP/1.1 200 OK\n\nWorkerRunnable: " +
this.serverText + " - " +
time +
"").getBytes());
output.close();
input.close();
System.out.println("Request processed: " + time);
} catch (IOException e) {
//report exception somewhere.
e.printStackTrace();
}
}
}
Java JDK1.5开始,里边的java.util.concurrent 实现的线程池。上边就创建了一个大小为10的线程池。相比于多线程服务端程序,这里是把一个socket连接封装成一个Runnable传给一个线程池来处理。在线程池里边由一个队列保存Runnable,当线程池里的一个线程空闲时,它就会出列一个Runnable并执行之。
用线程池,你可以控制服务端同时运行的最大线程数。当一个请求处理占用许多cpu,内存或者网络带宽时,如果同时处理多个请求,就会减低服务端的性能。所以你可以通过控制最大线程数,来减少服务端占用的资源,从而减低了资源不够用的风险(如OutOfMomery)。
如果有1000个请求,每个请求处理要1秒钟,要完成全部请求就要1000秒。如果每次同时只能处理10个请求,哪么第一个10个请求就会在10秒后完成。下一个10个请求就会在20秒后完成......只有最后的10个请求才会在1000秒后完成,这样服务端就能提供更好的性能/服务给客户端。
分享到:
相关推荐
3. **时钟的应用**:在PDA上实现时钟功能,也需要考虑多线程。一个后台线程可以周期性地更新时间并通知UI线程进行刷新,避免了因频繁操作主线程导致的性能问题。为了保证时间的准确性和线程安全,可以使用Windows ...
"MutiThread.7z"这个压缩包很可能包含了与多线程编程相关的代码示例或教程,特别是关于如何在Microsoft Foundation Classes (MFC)框架下实现多线程以及更新进度条的实践案例。 MFC是微软提供的一个C++类库,用于...
在C++标准库中,涉及多线程开发主要依赖于<thread>、、、、等头文件提供的工具和类。 首先,我们要了解多线程开发的基础概念。C++的多线程编程是建立在线程的概念之上的,线程是操作系统能够进行运算调度的最小单位...
1. **继承 Thread 类**:创建一个新的类,继承自 Thread 类,并重写其 `run()` 方法。然后通过实例化这个类并调用 `start()` 方法来启动线程。 ```java class MyThread extends Thread { public void run() { // ...
Thread newThread = new Thread(new ThreadStart(MyThreadMethod)); newThread.Start(); ``` 在这段代码中,`MyThreadMethod`是你定义的将在线程上执行的方法。`ThreadStart`委托类型指明该方法没有参数。 多线程在...
3. **跨线程调用**:由于控件只能在其创建的线程中访问,因此需要使用`Invoke`或`BeginInvoke`方法来进行跨线程调用。 #### 五、总结 通过对上述示例的分析,我们可以看出,在Winform应用中,通过合理地使用多线程...
`MutiThread`、`MultiThread3`、`MutiThread2`这些文件名可能代表了不同阶段的多线程示例代码,可能包含创建线程、同步机制的应用、线程间通信等实例。学习这些文件可以帮助理解如何在实际项目中应用多线程技术,...
3. 信号量(Semaphore):信号量是一种计数型同步机制,可以用于控制对共享资源的访问数量。 4. 原子操作(Atomic Operations):原子操作保证了操作不会被其他线程打断,是线程安全的。 六、线程退出与join 线程...
7. **使用MutiThread子文件**:根据提供的压缩包文件名`MutiThread`,我们可以推测这可能是包含实现多线程文件拷贝的源代码文件。实际操作中,我们需要导入并使用这个模块,按照上述步骤创建和管理线程实例,启动...
压缩包中的"MutiThread"可能包含实现这些功能的源代码文件,包括主程序、RC4算法实现以及可能的线程管理和同步代码。分析这些源代码可以帮助理解具体实现细节,如线程如何创建、如何交互以及如何测量执行时间。 总...
在Windows操作系统中,多线程编程是实现并发执行任务的有效方式,它可以充分利用多核处理器的计算能力,提高程序的响应速度和效率。本实例将深入探讨四种不同的同步机制:临界区、事件、信号量和互斥量,这些都是在...
androidMarket ... 3:通过排序显示应用4:按主题显示应用5:收集并分享您喜欢的应用6:检查更新。 7:搜索您想要的应用我想添加一些细节,但现在还没有。我的另一个专业人士中还有一个服务器演示。
4. **多线程支持**:Quartz天生支持多线程,可以并发地执行多个任务,这在文件名`mutiThread`中得到了暗示。在高并发场景下,Quartz能确保任务的正确调度和执行,避免了单线程模型下的资源争抢和阻塞问题。 5. **...
主要是使用Tcp/Ip协议来进行网络数据的发送和传播