`
muscle-liu
  • 浏览: 230041 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

SingleThread,MutiThread and Thread Pool(3)

阅读更多
接上上编著, 现在简单说说线程池服务端程序的实现。线程池服务端与多线程差不多,主要不同也是在于接收请求的循环:


 ......
 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秒后完成,这样服务端就能提供更好的性能/服务给客户端。

2
0
分享到:
评论

相关推荐

    MutiThread.rar

    3. **时钟的应用**:在PDA上实现时钟功能,也需要考虑多线程。一个后台线程可以周期性地更新时间并通知UI线程进行刷新,避免了因频繁操作主线程导致的性能问题。为了保证时间的准确性和线程安全,可以使用Windows ...

    MutiThread.7z

    "MutiThread.7z"这个压缩包很可能包含了与多线程编程相关的代码示例或教程,特别是关于如何在Microsoft Foundation Classes (MFC)框架下实现多线程以及更新进度条的实践案例。 MFC是微软提供的一个C++类库,用于...

    C++MutiThread.pdf

    在C++标准库中,涉及多线程开发主要依赖于<thread>、、、、等头文件提供的工具和类。 首先,我们要了解多线程开发的基础概念。C++的多线程编程是建立在线程的概念之上的,线程是操作系统能够进行运算调度的最小单位...

    java从入门到精通学习笔记-Lesson5(多线程).pdf

    1. **继承 Thread 类**:创建一个新的类,继承自 Thread 类,并重写其 `run()` 方法。然后通过实例化这个类并调用 `start()` 方法来启动线程。 ```java class MyThread extends Thread { public void run() { // ...

    C#多线程实例,超级好懂,附带Word说明文档

    Thread newThread = new Thread(new ThreadStart(MyThreadMethod)); newThread.Start(); ``` 在这段代码中,`MyThreadMethod`是你定义的将在线程上执行的方法。`ThreadStart`委托类型指明该方法没有参数。 多线程在...

    winform界面假死状态

    3. **跨线程调用**:由于控件只能在其创建的线程中访问,因此需要使用`Invoke`或`BeginInvoke`方法来进行跨线程调用。 #### 五、总结 通过对上述示例的分析,我们可以看出,在Winform应用中,通过合理地使用多线程...

    VC 多线程编程 C++

    `MutiThread`、`MultiThread3`、`MutiThread2`这些文件名可能代表了不同阶段的多线程示例代码,可能包含创建线程、同步机制的应用、线程间通信等实例。学习这些文件可以帮助理解如何在实际项目中应用多线程技术,...

    linux多线程编程

    3. 信号量(Semaphore):信号量是一种计数型同步机制,可以用于控制对共享资源的访问数量。 4. 原子操作(Atomic Operations):原子操作保证了操作不会被其他线程打断,是线程安全的。 六、线程退出与join 线程...

    Delphi多线程实现文件拷贝

    7. **使用MutiThread子文件**:根据提供的压缩包文件名`MutiThread`,我们可以推测这可能是包含实现多线程文件拷贝的源代码文件。实际操作中,我们需要导入并使用这个模块,按照上述步骤创建和管理线程实例,启动...

    多线程实现RC4流密码文件加密

    压缩包中的"MutiThread"可能包含实现这些功能的源代码文件,包括主程序、RC4算法实现以及可能的线程管理和同步代码。分析这些源代码可以帮助理解具体实现细节,如线程如何创建、如何交互以及如何测量执行时间。 总...

    windows中多线程编程实例

    在Windows操作系统中,多线程编程是实现并发执行任务的有效方式,它可以充分利用多核处理器的计算能力,提高程序的响应速度和效率。本实例将深入探讨四种不同的同步机制:临界区、事件、信号量和互斥量,这些都是在...

    androidMarket:该项目用于我学校的培训课程。这类似于Google市场。有以下一些功能

    androidMarket ... 3:通过排序显示应用4:按主题显示应用5:收集并分享您喜欢的应用6:检查更新。 7:搜索您想要的应用我想添加一些细节,但现在还没有。我的另一个专业人士中还有一个服务器演示。

    定时器quartz的应用

    4. **多线程支持**:Quartz天生支持多线程,可以并发地执行多个任务,这在文件名`mutiThread`中得到了暗示。在高并发场景下,Quartz能确保任务的正确调度和执行,避免了单线程模型下的资源争抢和阻塞问题。 5. **...

    基于Tcp/Ip的网络聊天室

    主要是使用Tcp/Ip协议来进行网络数据的发送和传播

Global site tag (gtag.js) - Google Analytics