早上起来修改了一个小程序,使用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的高级特性。
分享到:
相关推荐
Chrome.au3文件很可能是一个包含了具体代码示例的AutoIt脚本,用于说明如何控制Chrome。使用AutoIt操作Chrome主要是通过其强大的窗口控制功能和模拟用户输入的能力。以下是一些可能实现的功能: 1. 打开/关闭Chrome...
Chrome 60是Google Chrome浏览器的一个重要版本,它在2017年发布,带来了许多新功能、性能改进和安全更新。Chrome浏览器是全球最受欢迎的网络浏览器之一,以其快速、稳定和用户友好的界面著称。 1. **V8 JavaScript...
在2016年,Chrome发布了v49.0.2623.112这一重要版本,为用户带来了诸多改进和新特性。 **一、界面与设计** Chrome v49在界面设计上保持了简洁明快的风格,注重用户体验。该版本对UI细节进行了微调,使得整体视觉...
标题中的“Google Chrome最后一个支持flash的版本”指的是Google Chrome浏览器在某一特定时期内对Adobe Flash Player的支持达到了终点。Adobe Flash曾经是网页上多媒体内容的重要载体,尤其在视频和游戏领域广泛应用...
Chrome浏览器扩展程序,通常被称为Chrome插件,是增强和自定义Chrome功能的小型软件应用程序。这些插件由JavaScript、HTML和CSS等Web技术编写,并利用Chrome的API来实现各种功能,如广告拦截、隐私保护、生产力提升...
49.0.2623.112版本的Chrome具有以下关键特性: 1. **安全强化**:此版本包含了一系列的安全补丁,修复了已知的安全漏洞,以保护用户免受网络攻击。 2. **性能优化**:谷歌持续对浏览器进行性能优化,使得即使在较...
标题中的“最后一个支持XP的Chrome版本”指的是Google Chrome浏览器在Windows XP操作系统上的最后一个官方更新版本。这个特定的版本号37.0.2062.102,是谷歌为了确保仍在使用XP系统的用户能够继续享受基本的安全更新...
尽管它们的市场份额逐渐被Windows 7和后来的Windows 10所取代,但因为各种原因,如设备升级成本、企业内部系统兼容性等,仍有一部分用户坚守在这些老系统上。Chrome 49.0.2623.112就是谷歌为这些用户提供服务的最后...
Chrome V44是一款由Google开发的网络浏览器,其在2015年发布,属于较早的版本。作为前端开发者的重要工具,Chrome以其强大的性能、丰富的开发者工具以及对Web标准的良好支持而广受赞誉。这款浏览器尤其适用于Windows...
虽然“Java”在标签中被提及,但Chrome本身并不依赖Java运行。Java是指甲骨文公司的Java平台,主要用于开发和运行跨平台的应用程序。而Chrome支持的是JavaScript,这是一种广泛用于网页开发的脚本语言,两者并不相同...
标题“Chrome23正式版”指的是Google Chrome浏览器的第23个主要版本,这是一个重要的更新,通常包含了多项改进和新特性。Chrome浏览器以其快速、安全和用户友好的界面而受到广泛赞誉。 描述中的“很好用,简洁”...
ActiveX for Chrome是一款专为谷歌浏览器(Chrome)设计的ActiveX控件,允许用户在Chrome浏览器上运行需要ActiveX技术的网页应用。ActiveX是一种由微软开发的技术,主要用于Internet Explorer,它提供了创建和使用...
5. **其他高级特性**:除了基本功能外,可能还包括鼠标悬停效果、滑动切换标签、最小化标签、预览功能等。开发者需要编写代码来处理这些复杂的交互,以增强用户体验。 实现这样的控件通常需要深入理解.NET ...
1. 安装特定版本的Chrome,如描述中的42.0.2311.135,因为某些特性可能只在特定版本中可用。 2. 安装或导入chrome.r39.crx扩展,该扩展提供了对IE内核的模拟。 3. 可能需要运行ffactivex-setup-r39.exe,尽管它看...
总结,了解Chrome扩展及应用开发需要掌握一系列核心知识点,包括扩展开发基础、架构、权限和安全、开发工具使用、高级特性、以及发布和管理策略。开发者通过这些知识,能够创建出功能丰富、安全可靠、用户友好的...
例如,一个在最新版Chrome中正常工作的功能,在老版本中可能无法正常运行,因为新特性可能未被老版本支持。通过Chrome版本模拟器,开发者可以在不实际安装多个浏览器的情况下,快速切换到特定版本进行测试。 **...
其次,Chrome的多进程架构是另一个关键特性。每个打开的标签页运行在独立的进程中,这提高了浏览器的稳定性,即使一个页面崩溃也不会影响其他页面的正常运行。同时,这种设计也提高了资源管理效率,减少了内存占用。...
Chrome 浏览器是全球最流行的网页浏览工具之一,它以其快速、稳定和高度可定制的特性深受用户喜爱。在日常使用中,我们有时需要设置特定的页面为启动时的首页,也就是“主页”。本教程将详细介绍如何在Chrome中覆盖...
Chrome浏览器是Google开发的一款流行的网页浏览器,以其稳定性和高性能赢得了全球用户的喜爱。版本号99.0.4844.51代表了这个特定版本的Chrome,它可能包含了安全更新、性能优化以及对Web标准的支持增强。"Chrome ...
注,chrome 通过注册表注册表 只能调用本地的 exe 或者bat文件,不能调用 ppt word 这样的问题,所以我用VB 写了一个exe 可以接收调用参数,这样只许注册一次就可以通过传参打开所有课执行文件了 由于1.exe是后台...