`
wufan0023
  • 浏览: 29676 次
  • 性别: Icon_minigender_1
  • 来自: hefei
社区版块
存档分类
最新评论

阻塞式线程池服务器程序实例

阅读更多

Excutor 接口 --- 线程池
            .execute(Runnable task) --- 执行Runnable类型的任务。

Executors  --- 负责生成各种连接池的实例
           .newCachedThreadPool()  --- 有任务时才创建新线程,空闲线程保留60s。
           .newFixedThreadPool(int nThreads)  --- 创建固定数量的线程,空闲线程会一直保留。 
           .newScheduledThreadPool(int corePoolSize) --- 线程池按照时间计划执行任务,允许设置任务执行时  间。参数为最小线程数。繁忙时,可能创建更多线程。
           .newSingleThreadExecutor() --- 只建立一个工作线程,依次执行每个任务。
           .newSingleThreadScheduledExecutor() ----只一个线程,按时间计划执行任务。 
           

ExecutorService --- 负责连接池的管理           
            

import java.io.*;
import java.nio.*;
import java.nio.channels.*;
import java.nio.charset.*;
import java.net.*;
import java.util.*;
import java.util.concurrent.*;

public class EchoServer {
  private int port=8001;
  private ServerSocketChannel serverSocketChannel = null;
  private ExecutorService executorService;   //线程池
  private static final int POOL_MULTIPLE = 4;   //线程池数目
  
  /**
   * 负责构造线程池,启动服务区,并绑定端口
   * @throws IOException
   */
  public EchoServer() throws IOException {
	//创建线程池
    executorService= Executors.newFixedThreadPool(
	    Runtime.getRuntime().availableProcessors() * POOL_MULTIPLE);
    //创建通道
    serverSocketChannel= ServerSocketChannel.open();
    //在同一主机上关闭服务器程序,再启动该服务器服务时,能绑定同一端口。
    serverSocketChannel.socket().setReuseAddress(true);
    //绑定本地端口
    serverSocketChannel.socket().bind(new InetSocketAddress(port));
    System.out.println("服务器启动");
  }
  /**
   * 负责客户端连接,每接受一个客户连接,就把它交给线程池来处理。
   * 1.从线程池中取出空闲线程
   * 2.执行Handler的run()方法。
   */
  public void service() {
    while (true) {
      SocketChannel socketChannel=null;
      try {
        socketChannel = serverSocketChannel.accept();// 从连接池中获取一个连接通道
        executorService.execute(new Handler(socketChannel)); // 在工作线程中进行服务
      }catch (IOException e) {
         e.printStackTrace();
      }
    }
  }

  public static void main(String args[])throws IOException {
    new EchoServer().service();
  }
}
/**
 * 负责客户通信
 * @author Jethro Yan
 *
 */
class Handler implements Runnable{
  private SocketChannel socketChannel;
  public Handler(SocketChannel socketChannel){
    this.socketChannel=socketChannel;
  }
  public void run(){
    handle(socketChannel);
  }
  
  //负责和客户端通信工作。
  public void handle(SocketChannel socketChannel){
    try {
        Socket socket=socketChannel.socket();// 获得socket。
        System.out.println("接收到客户连接,来自: " +
        socket.getInetAddress() + ":" +socket.getPort());

        BufferedReader br =getReader(socket);
        PrintWriter pw = getWriter(socket);

        String msg = null;
        while ((msg = br.readLine()) != null) {
          System.out.println(msg);
          pw.println(echo(msg));
          if (msg.equals("bye"))
            break;
        }
      }catch (IOException e) {
         e.printStackTrace();
      }finally {
         try{
           if(socketChannel!=null)socketChannel.close();
         }catch (IOException e) {e.printStackTrace();}
      }
  }

  private PrintWriter getWriter(Socket socket)throws IOException{
    OutputStream socketOut = socket.getOutputStream();
    return new PrintWriter(socketOut,true);
  }
  private BufferedReader getReader(Socket socket)throws IOException{
    InputStream socketIn = socket.getInputStream();
    return new BufferedReader(new InputStreamReader(socketIn));
  }

  public String echo(String msg) {
    return "echo:" + msg;
  }
}

 

分享到:
评论
1 楼 ak913 2012-09-08  
Line41:        executorService.execute(new Handler(socketChannel)); // 在工作线程中进行服务 
这一步不是阻塞操作,也就是说如果池中的任务处理速度不够,而新请求也可以源源不断地加入到线程池的等待队列,不会被阻塞

相关推荐

    java线程池实例详细讲解

    Java线程池是一种高效管理线程资源的工具,它能够帮助开发者有效地控制并调度线程,从而提升系统性能,减少系统资源的浪费。...通过深入学习和实践,我们可以更好地利用线程池来优化我们的Java应用程序。

    完成端口结合线程池类库,源码,实例

    本文将深入探讨完成端口结合线程池的原理和应用,以及如何通过提供的源码和实例来理解和使用这种技术。 首先,理解完成端口的基本概念至关重要。完成端口是一种通知机制,当异步I/O操作完成时,系统会将事件通知放...

    线程池方式的libevent-server.zip

    在"线程池方式的libevent-server.zip"中,我们看到的是一个利用libevent库构建的线程池服务器的实例,它巧妙地结合了多线程和libevent的优势,以提供高并发、低延迟的服务。 首先,"监听是一个单独线程"这一设计...

    开放型应用服务器使用实例

    总的来说,“开放型应用服务器使用实例”展示了如何利用配置文件、SQL和LUA来构建一个强大的服务器系统。这样的设计既保留了灵活性,又保证了代码的模块化,使得开发和维护变得更加容易。通过理解和实践这些核心概念...

    高性能服务器架构实例 服务器端加客户端

    综上所述,"高性能服务器架构实例 单机测试突破 3W连接"的实现涉及了众多的软件工程和技术细节,包括异步I/O、线程池管理、非阻塞I/O、事件驱动编程、连接复用、负载均衡、内存管理、协议优化、数据压缩以及日志监控...

    线程池的简单实现

    线程池是多线程编程中的一个重要概念,它在服务器端程序中被广泛使用,以提高资源利用率和系统性能。线程池通过预先创建并管理一定数量的线程,可以有效地减少线程创建和销毁的开销,同时提供了一种灵活的线程调度和...

    QTCPSocket线程池方法

    线程池(ThreadPool)是一种资源管理技术,它允许我们将任务分配到多个工作线程中,以提高程序执行效率并避免过度消耗系统资源。在给定的代码示例中,`myserver.cpp` 和 `mytask.cpp` 可能包含了使用线程池处理TCP...

    基于完成端口的服务器程序源代码

    综上所述,基于完成端口的服务器程序源代码是一个关于高性能并发处理的实例,对于理解Windows系统下的服务器开发和优化具有重要价值。通过深入学习和实践,开发者能够掌握这一高效并发模型,并将其应用到自己的项目...

    epoll 多线程 线程池

    最后,尝试自己编写一个简单的应用,例如一个使用epoll的TCP服务器,配合多线程和线程池处理客户端请求,以此巩固所学知识。 总之,epoll、多线程和线程池是构建高性能、高并发系统的关键技术,熟练掌握它们对于...

    异步IO、APC、IO完成端口、线程池与高性能服务器.doc

    总的来说,这份文档全面介绍了构建高性能服务器所涉及的关键技术,并通过实例和概念解释,帮助读者理解如何利用异步IO、APC、IO完成端口和线程池来优化服务器性能。这些技术的掌握对于开发高效、可靠的网络服务至关...

    Python 应用之线程池.pdf

    1. 预创建一定数量的线程,在程序启动后立即完成初始化,并处于阻塞状态(Suspended),消耗少量内存但不消耗CPU资源。 2. 工作队列的初始化,用于存放请求任务的运行环境和参数。 3. 在任务执行阶段,程序将从工作...

    linux c 线程池连接mysql

    使用`epoll_create()`, `epoll_ctl()`, `epoll_wait()`等函数,可以构建出一个非阻塞的I/O模型,提高服务器的并发处理能力。 3. **线程池**: 在高并发场景中,频繁创建和销毁线程会带来较大的开销。线程池技术...

    C# 简单MSSQL线程池+异步SOCKET服务端完整源码

    这些技术对于任何希望在.NET环境中构建高效、可扩展的服务器端应用程序的开发者来说,都是至关重要的。 首先,让我们了解线程池(ThreadPool)。线程池是一种管理线程资源的技术,它可以有效地减少创建和销毁线程的...

    Qt多线程TCP服务器

    在开发网络应用程序时,多线程技术常常被用于提高服务器的并发处理能力。Qt库作为一个跨平台的C++框架,提供了丰富的功能,包括对网络编程的支持。本篇将深入讲解如何使用Qt构建一个多线程的TCP服务器。 首先,我们...

    客户端和服务器端通信程序C#代码

    本篇将深入探讨客户端和服务器端通信程序的C#实现,以及在聊天实例程序中的应用。 首先,客户端是发起请求的一方,通常是一个用户界面,它与用户交互并发送数据到服务器。服务器端则是接收和处理这些请求,然后返回...

    并发服务器-多线程服务器详解

    ### 并发服务器—多线程服务器详解 #### 一、引言 在现代软件开发中,特别是网络应用和服务的设计中,对并发处理能力的需求日益增长。为了满足高并发访问的需求,开发人员常采用多线程技术来构建高效、响应迅速的...

    jetty嵌入式服务器实例大全

    `jetty-server.xml`和`jetty-webapp.xml`是常见的配置文件,可以定义服务器端口、线程池、会话管理策略等。 4. **部署WAR包**: Jetty可以作为WAR包的应用服务器,只需将WAR文件放入Jetty的webapps目录下,Jetty会...

    Linux高性能服务器编程_随书代码

    日志记录和错误处理是服务器程序不可或缺的部分。良好的日志系统可以帮助开发者在出现问题时快速定位故障,而合理的错误处理机制能确保服务器在异常情况下仍能优雅地运行。 最后,性能分析和调优是服务器开发的后期...

    商业编程-源码-让多个程序实例运行在同个进程空间的多个线程中.zip

    综上所述,让多个程序实例在同个进程空间的多个线程中运行涉及到多线程编程的核心概念和技术,包括线程创建、同步、死锁预防、优先级和线程池。掌握这些知识点对于编写高效、可靠的商业软件至关重要。在实际开发中,...

    Qt:Tcp服务器与客户端程序

    在TCP服务器的设计中,当一个新连接到来时,服务器通常会创建一个新的线程或使用线程池来处理该连接,从而保持服务器的响应性,避免因为单一线程处理所有连接而导致的阻塞。 在Qt中,可以使用`QTcpServer`类来创建...

Global site tag (gtag.js) - Google Analytics