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

转载于:https://www.cnblogs.com/elvinni/p/4162982.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432101.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ANTLR VS FLEXBISON

1. ANTLR可以一站式的解决词法与语法解析器的生成。 FLEX&BISON需要配合使用,一个实现词法解析器,一个实现语法解析器。 2. ANTLR通过在文法文件中的设置,可以生成多个语言代码。 options {languageCpp;} options {languageCSharp;} op…

[POJ 1742] Coins 【DP】

题目链接:POJ - 1742 题目大意 现有 n 种不同的硬币,每种的面值为 Vi ,数量为 Ni ,问使用这些硬币共能凑出 [1,m] 范围内的多少种面值。 题目分析 使用一种 O(nm) 的 DP (据说这是类多重背包?)&…

ubuntu 18.04 显卡驱动

1. 禁用ubuntu默认显卡驱动,在/etc/modprobe.d/目录下创建blacklist-nouveau.conf文件并添加以下内容 blacklist vga16fb blacklist nouveau blacklist rivafb blacklist nvidiafb blacklist rivatu 2. 刷新内核,重启 update-initramfs -u reboo…

UE4 查看打包文件内容

UnrealPak.exe pak文件 -list -cryptokeys工程下Crypto.json文件 >输出文件

【iOS】Quartz2D图片剪切

一、使用Quartz2D完成图片剪切1.把图片显示在自定义的view中  先把图片绘制到view上。按照原始大小,把图片绘制到一个点上。  代码: 1 - (void)drawRect:(CGRect)rect 2 { 3 UIImage *image2[UIImage imageNamed:"me"]; 4 [image2…

InstallShield 2020

1.新建工程:HOME-New-Basic MSI 2.Gereral Information设置(根据需求自行设置,例如下图) 3.Files and Folders设置 a.将需打包工程拖拽至下方目标文件夹内 b.创建新的Feature c.设置结果如下 4.Shortcuts设置 a.Desktop右键-New…

iOS项目开发— CoreLocation的定位服务和地理编码与发编码实现

一、CoreLocation简介 1.在移动互联网时代,移动app能解决用户的很多生活琐事,比如 (1)导航:去任意陌生的地方 (2)周边:找餐馆、找酒店、找银行、找电影院 2.在上述应用中&#xff0c…

Target “xxx” links to target “Boost::filesystem“ but the target was not found

Boost::system Boost::thread Boost::timer等等替换为${Boost_LIBRARIES}即可

eclipse 断点调试快捷键

(1)CtrlM --切换窗口的大小(2)CtrlQ --跳到最后一次的编辑处(3)F2 --当鼠标放在一个标记处出现Tooltip时候按F2则把鼠标移开时…

cygwin和mingw的区别

1、使用区别: cygwin/gcc和MinGW都是gcc在windows下的编译环境,但是它们有什么区别,在实际工作中如何选择这两种编译器。 cygwin/gcc完全可以和在linux下的gcc化做等号,这个可以从boost库的划分中可以看出来端倪,cygw…

轻量级web富文本框——wangEditor使用手册(4)——配置下拉菜单 demo

最新版wangEditor: 配置说明:http://www.wangeditor.com/doc.html demo演示:http://www.wangeditor.com/wangEditor/demo.html 下载地址:https://github.com/wangfupeng1988/wangEditor ----------------------------------------…

Linux下解决发布Qt程序报错:it could not find or load the Qt platform plugin “xcb” in “”

简述 用Qt5.8版本在ubuntu16.04版本下编写Qt应用程序,生成release版本并打包,到另一台无Qt环境的linux系统中运行。 网上通常是按以下几个步骤进行: 1、生成release程序。 2、拷贝release程序到一个新文件夹,执行一个脚本文件。脚…

ViewGroup之getScrollX()

举个例子,一个横向的ViewGroup,如果每个View的宽度为300,那么当前显示第一个View的时候getScrollX()返回值为0,当你 向左移动第一个View,移动距离为30,那么此时getScrollX()的返回值为30,如果当…

Linux环境中Qt程序的手工发布

Qt 5.7.0 编写的程序需要部署到一台没有安装Qt的目标机器上,程序采用C与QML混合编程,QML做界面,C写逻辑。 环境说明 开发环境 Ubuntu 16.04.1 LTS 运行环境 CentOS 7.2.1511 下面描述这个手工操作的发布过程。 1、在开发环境中采用Re…

VS2017编译UE4.19.2报错

error C4577: 在未指定异常处理模式的情况下使用了 "noexcept";不一定会在异常时终止。指定 /EHsc 修改 VCToolChain.cs, 在 AppendCLArguments_Global 函数中增加 Arguments.Add("/EHsc");

OpenGL-坐标系

笛卡尔坐标系 二维绘图:笛卡尔坐标有一个X轴和一个Y轴组成,X轴为水平方向,Y轴为垂直方向,X和Y相互垂直二维笛卡尔坐标系 三维绘图:笛卡尔坐标多了一个Z轴,Z轴同时垂直于X和Y轴。Z轴的实际意义代表着三维物…

Heap Sort

Heap(An array visualized as a complete binary tree): Heap Operations: Insert,                         O(log(n))  Add it to the end of the tree and bubble it up. Find Max(return the element with maximum key),   O(1)Extract Max(fi…

UML类图与类间六种关系表示

1.类与类图 类封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性,操作,关系的对象集合的总称. 类图是使用频率最高的UML图之一. 类图用于描述系统中所包含的类以及它们之间的相互关系,帮助开发人员理解系统,它是系统分析和设计阶段的重要产物,也是系统编码和测试…

C# 延迟初始化

一个对象的延迟初始化意味着该对象的创建将会延迟至第一次使用该对象时。(在本主题中,术语“延迟初始化”和“延迟实例化”是同义词。)延迟初始化主要用于提高性能,避免浪费计算,并减少程序内存要求。 以下是最常见的方…

FindWindowEx 遍历所有窗口

FindWindowEx 唯一麻烦是第2个参数的指定 . Explore 下窗口是Z序的 , 实际上就是根据 第一个参数 和 第2个参数 来找 第2个参数后的一个窗口: HWND child 0; child FindWindowEx ( NULL , child ,NULL,NULL); 这样 , child 就是一个Explore , 然后 , 通过循环能够找到…