• ThreadPoolExecutor源码学习(2)-- 在thrift中的应用


    thrift作为一个从底到上除去业务逻辑代码,可以生成多种语言客户端以及服务器代码,涵盖了网络,IO,进程,线程管理的框架,着实庞大,不过它层次清晰,4层每层解决不同的问题,可以按需取用,相当方便。

    +-------------------------------------------+
    | Server                                    |  -- 服务器进程调度
    | (single-threaded, event-driven etc)       |
    +-------------------------------------------+
    | Processor                                 |  -- RPC接口处理函数分发,IDL定义接口的实现将挂接到这里面
    | (compiler generated)                      |
    +-------------------------------------------+
    | Protocol                                  |  -- 协议
    | (JSON, compact etc)                       |
    +-------------------------------------------+
    | Transport                                 |  -- 网络传输
    | (raw TCP, HTTP etc)                       |
    +-------------------------------------------+

    其实对于服务端编程的技术大牛来说,服务器调度可能最能体现个人技术功底,但是从传输层,到序列化这层的工作,确实是比较繁琐工作,可以直接利用thrift生成的代码来完成问题。

    以上为题外话,在thrift的java代码实现Server这一层有个TThreadPoolServer,里面对于线程管理就是使用ThreadPoolExecutor,下面贴下核心代码

      public void serve() {
        try {
          serverTransport_.listen();
        } catch (TTransportException ttx) {
          LOGGER.error("Error occurred during listening.", ttx);
          return;
        }
    
        stopped_ = false;
        while (!stopped_) {
          int failureCount = 0;
          try {
            TTransport client = serverTransport_.accept();
            WorkerProcess wp = new WorkerProcess(client);
            executorService_.execute(wp);//这个就是ThreadPoolExecutor
          } catch (TTransportException ttx) {
            if (!stopped_) {
              ++failureCount;
              LOGGER.warn("Transport error occurred during acceptance of message.", ttx);
            }
          }
        }
    
        executorService_.shutdown();
    
        // Loop until awaitTermination finally does return without a interrupted
        // exception. If we don't do this, then we'll shut down prematurely. We want
        // to let the executorService clear it's task queue, closing client sockets
        // appropriately.
        long timeoutMS = options_.stopTimeoutUnit.toMillis(options_.stopTimeoutVal);
        long now = System.currentTimeMillis();
        while (timeoutMS >= 0) {
          try {
            executorService_.awaitTermination(timeoutMS, TimeUnit.MILLISECONDS);
            break;
          } catch (InterruptedException ix) {
            long newnow = System.currentTimeMillis();
            timeoutMS -= (newnow - now);
            now = newnow;
          }
        }
      }

    值得注意的是在执行完所有任务的时候,需要调用shutdown()方法,这个在网上的很多例子都有,但是对于最后一段作者反复检查状态再退出,这个着实没有必要的,在shutdown()方法中就有类似的代码了(jdk1.7);再者java并不会在主线程退出的情况下会对其他线程造成影响,所以这段代码更显多余:-D

  • 相关阅读:
    GUI编程之贪吃蛇
    GUI编程之Swing
    Java学习笔记01
    软件测试之使用jmeter进行压力测试
    GitHub以及Git安装的使用
    Axure RP介绍
    结对编程之四则运算
    随心开始
    JAVA入门之简介
    input之File对象的简单介绍
  • 原文地址:https://www.cnblogs.com/elvinni/p/4162982.html
Copyright © 2020-2023  润新知