早上起来修改了一个小程序,使用Jetty嵌入的方式写了一个Servlet。因为第一次使用Jetty,不太熟悉对Servlet的多线程的处理方式。写了一个简单的测试代码:
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//log.info("process thread:" + Thread.currentThread().getId() + "\tname:" + Thread.currentThread().getName());
log.info("process thread:" + Thread.currentThread().getId() + "\tname:" + Thread.currentThread().getName());
try{
log.info("Sleep sevlet:" + this.hashCode());
Thread.sleep(1000 * 20);
}catch(Exception e){
}
}
Jetty的启动部分:
Server server = new Server(httpPort);
System.out.println("Listening HTTP port:" + httpPort);
ServletHandler handler=new ServletHandler();
server.setHandler(handler);
handler.addServletWithMapping("org.socialnet.servlet.StatusServlet", "/test1/*");
handler.addServletWithMapping("org.socialnet.servlet.StatusServlet", "/test2/*");
server.start();
server.join();
System.out.println("Shutdown HTTP service..");
打开我的Chrome,在两个不同的标签页里面输入:
http://127.0.0.1:8081/test1,
按理说应该出现2个,“Sleep sevlet: xxx” 的信息。因为Sevlet是多线程的。 但是事实上并没有同时出现2个Sleep的线程。而是一个Sleep结束后,才出现另外一个Sleep servelt.
这个时候可能很多人第一反应就是,Jetty的线程池大小不足,或者是单线程在处理请求。我觉得这种想法是合理的,本来Jetty就是轻量级的Server. 使用单线程来处理请求也没有什么不可以。为了验证这想法,修改了一下Jetty的启动部分:
Server server = new Server(httpPort);
System.out.println("Listening HTTP port:" + httpPort);
ServletHandler handler=new ServletHandler();
server.setHandler(handler);
handler.addServletWithMapping("org.socialnet.servlet.StatusServlet", "/test1/*");
handler.addServletWithMapping("org.socialnet.servlet.StatusServlet", "/test2/*");
server.start();
log.info("thread:" + server.getThreadPool().getThreads() +
"\tidle:" + server.getThreadPool().getIdleThreads());
server.join();
System.out.println("Shutdown HTTP service..");
输出活动线程的数量,果然和我期望一样,“thread:1 tidle:0” 只有一个服务线程启动了。马上google/ baidu 查询增加线程数量的方式。由于都要引入额外的包。我决定自己写一个简单的线程池,代码如下:
ThreadPool pool = new ThreadPool(){
@Override
public boolean dispatch(final Runnable arg0) {
log.info
new Thread(){
public void run(){
arg0.run();
}
}.start();
return true;
}
....
};
对于每一个新的任务都启动一个新的线程,这下总可以了吧。 启动服务器。还是在多个标签窗口中刷新 " http://127.0.0.1:8081/test1" 还是没有按我期望的那样同时出现多个“Sleep servelt" 都是每隔20多秒出现一个"Sleep servelt" 感觉Sevlet就是在单线程运行一样。继续查看Jetty的API Doc. 说什么ServletHandler 不是完整的Sevelt的实现,有些限制,需要运行在Context里面才能是完整的Sevlet实现。 修改了代码
测试,还是如此。
后来试了以下在不同的标签打开:
http://127.0.0.1:8081/test1,
http://127.0.0.1:8081/test2,
这下出现了2个”Sleep servlt"了。但是无论我怎么增加线程,和在不同的标签页刷新,Sevelet总是串行的运行。实在是没有办法了,只好修改线程池,把运行的线程都输出看阻塞在什么地方了。最后发现一个问题,无论在多少个标签中刷新:
http://127.0.0.1:8081/test1。 都只会有一个TCP连接在线程池里面。原来Chrome对相同的URL,在不同 的标签打开只会连立一个连接。换成IE测试了一下,每次刷新都会出现一个新的Connection.
折腾了一上午,原来是Chrome的高级特性。
分享到:
相关推荐
Google Chrome 浏览器架构解析及相关特性分析
chrome chrome
chrome chrome chrome chrome
注,chrome 通过注册表注册表 只能调用本地的 exe 或者bat文件,不能调用 ppt word 这样的问题,所以我用VB 写了一个exe 可以接收调用参数,这样只许注册一次就可以通过传参打开所有课执行文件了 由于1.exe是后台...
Google Chrome Backup 是一款完整备份Chrome设置(包括历史和扩展), Chrome 历史记录、书签、扩展等等信息的工具,支持 Chromium 及 Portable 版本。 如果使用的是安装版的 Chrome,那么运行 Google Chrome Backup...
GoogleChrome最后一个支持flash的版本,含FLASH插件
chrome插件XSwitch chrome插件XSwitch
Google Chrome支持多标签浏览,每个标签页面都在独立的“沙箱”内运行,在提高安全性的同时,一个标签页面的崩溃也不会导致其他标签页面被关闭。此外,Google Chrome基于更强大的JavaScript V8引擎,这是当前Web...
Chrome Frame 是 Google 推出的一个针对 IE 6,7,8 开发的免费开源的浏览器插件,它可以让IE浏览器使用上webkit 内核。使用该插件后,用户的 IE 将获得和Chrome浏览器一样的高性能和丰富的功能,例如高速的...
这里给大家推荐一个Chrome扩展。 官方网站 http://www.long-int.com/chrome-helper/ Google Chrome 浏览器下载:Google Chrome 75.0.3770.142 for Mac/Win/Linux 谷歌浏览器离线完整安装版 使用方法 点击...
Google Chrome浏览器下载,谷歌浏览器(Google Chrome)是谷歌公司开发的一款免费的网络浏览器。它拥有简洁的界面,机智的地址栏,强大的浏览选项和web应用扩展。Chrome 浏览器的目标是让上网变简单、快速和安全。 主要...
autoit控制chrome的扩展库,正式拜托麻烦的IE
ChromeSetup+Chrome安装软件
49.0.2623.112_chrome_installer,谷歌浏览器chrome支持xp系统的最后一个版本
Axure RP Chrome 0.6.4 原型工具Chrome扩展插件,支持最新版本Chrome浏览器,安装方法如下(亲测可用): 1、打开谷歌浏览器,在浏览器中地址栏中输入chrome://extensions/,或者点击浏览器的右上角选择更多工具,...
Axure RP Extension for Chrome是原型设计工具Axure RP的Chrome浏览器插件。因为在线安装需要访问Google Chrome在线商店,访问不了。所以提供一个离线版本进行安装。 安装方法: 1、打开Chrome浏览器,找到“工具 ->...
Chrome DevTools(Chrome 开发者工具) 是内嵌在 Chrome 浏览器里的一组用于网页制作和调试的工具。官网还推荐一款叫做 Chrome 金丝雀版本(Chrome Canary)的 Chrome 浏览器,从这里你可以获得最新版本的 DevTools...
Chrome是一款由Google公司开发的网页浏览器。该浏览器基于其他开源软件(如WebKit)撰写,目标是提升稳定性、速度和安全。Google Chrome 是一款快速、易用且安全的网络浏览器。此版 Chrome 是专为windows10 64位设计...
谷歌浏览器 Chrome 安装包 ChromeSetup.exe
Google Chrome 49.0.2623.112 支持XP和Vista的最后一个版本,直接双击安装。