`
kgd924
  • 浏览: 43836 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

被Chrome的高级特性折腾了一上午

阅读更多

早上起来修改了一个小程序,使用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_autoit操作chrome_autoit3chrome_autoit_autoitchrome_chrome_源

    Chrome.au3文件很可能是一个包含了具体代码示例的AutoIt脚本,用于说明如何控制Chrome。使用AutoIt操作Chrome主要是通过其强大的窗口控制功能和模拟用户输入的能力。以下是一些可能实现的功能: 1. 打开/关闭Chrome...

    chrome 60 chrome

    Chrome 60是Google Chrome浏览器的一个重要版本,它在2017年发布,带来了许多新功能、性能改进和安全更新。Chrome浏览器是全球最受欢迎的网络浏览器之一,以其快速、稳定和用户友好的界面著称。 1. **V8 JavaScript...

    Google Chrome v49 版本

    在2016年,Chrome发布了v49.0.2623.112这一重要版本,为用户带来了诸多改进和新特性。 **一、界面与设计** Chrome v49在界面设计上保持了简洁明快的风格,注重用户体验。该版本对UI细节进行了微调,使得整体视觉...

    GoogleChrome最后一个支持flash的版本

    标题中的“Google Chrome最后一个支持flash的版本”指的是Google Chrome浏览器在某一特定时期内对Adobe Flash Player的支持达到了终点。Adobe Flash曾经是网页上多媒体内容的重要载体,尤其在视频和游戏领域广泛应用...

    一系列chrome 例子插件

    Chrome浏览器扩展程序,通常被称为Chrome插件,是增强和自定义Chrome功能的小型软件应用程序。这些插件由JavaScript、HTML和CSS等Web技术编写,并利用Chrome的API来实现各种功能,如广告拦截、隐私保护、生产力提升...

    chrome_xp谷歌最后一个支持xp系统的浏览器版本49.0.2623.112_chrome_installer

    49.0.2623.112版本的Chrome具有以下关键特性: 1. **安全强化**:此版本包含了一系列的安全补丁,修复了已知的安全漏洞,以保护用户免受网络攻击。 2. **性能优化**:谷歌持续对浏览器进行性能优化,使得即使在较...

    最后一个支持xp的chrome版本

    标题中的“最后一个支持XP的Chrome版本”指的是Google Chrome浏览器在Windows XP操作系统上的最后一个官方更新版本。这个特定的版本号37.0.2062.102,是谷歌为了确保仍在使用XP系统的用户能够继续享受基本的安全更新...

    Google Chrome 49.0.2623.112 支持XP和Vista的最后一个版本

    尽管它们的市场份额逐渐被Windows 7和后来的Windows 10所取代,但因为各种原因,如设备升级成本、企业内部系统兼容性等,仍有一部分用户坚守在这些老系统上。Chrome 49.0.2623.112就是谷歌为这些用户提供服务的最后...

    chrome v44 浏览器

    Chrome V44是一款由Google开发的网络浏览器,其在2015年发布,属于较早的版本。作为前端开发者的重要工具,Chrome以其强大的性能、丰富的开发者工具以及对Web标准的良好支持而广受赞誉。这款浏览器尤其适用于Windows...

    ChromeSetup+Chrome安装软件

    虽然“Java”在标签中被提及,但Chrome本身并不依赖Java运行。Java是指甲骨文公司的Java平台,主要用于开发和运行跨平台的应用程序。而Chrome支持的是JavaScript,这是一种广泛用于网页开发的脚本语言,两者并不相同...

    chrome23正式版

    标题“Chrome23正式版”指的是Google Chrome浏览器的第23个主要版本,这是一个重要的更新,通常包含了多项改进和新特性。Chrome浏览器以其快速、安全和用户友好的界面而受到广泛赞誉。 描述中的“很好用,简洁”...

    ActiveXforChrome.zip

    ActiveX for Chrome是一款专为谷歌浏览器(Chrome)设计的ActiveX控件,允许用户在Chrome浏览器上运行需要ActiveX技术的网页应用。ActiveX是一种由微软开发的技术,主要用于Internet Explorer,它提供了创建和使用...

    Winform 高仿 Chrome 的 Tab页控件

    5. **其他高级特性**:除了基本功能外,可能还包括鼠标悬停效果、滑动切换标签、最小化标签、预览功能等。开发者需要编写代码来处理这些复杂的交互,以增强用户体验。 实现这样的控件通常需要深入理解.NET ...

    chrome实现ie内核(chrome.r39.crx+ffactivex-setup-r39.exe+控件例子)

    1. 安装特定版本的Chrome,如描述中的42.0.2311.135,因为某些特性可能只在特定版本中可用。 2. 安装或导入chrome.r39.crx扩展,该扩展提供了对IE内核的模拟。 3. 可能需要运行ffactivex-setup-r39.exe,尽管它看...

    CHROME扩展及应用开发 PDF 带目录 高清完整版

    总结,了解Chrome扩展及应用开发需要掌握一系列核心知识点,包括扩展开发基础、架构、权限和安全、开发工具使用、高级特性、以及发布和管理策略。开发者通过这些知识,能够创建出功能丰富、安全可靠、用户友好的...

    chrome版本模拟器

    例如,一个在最新版Chrome中正常工作的功能,在老版本中可能无法正常运行,因为新特性可能未被老版本支持。通过Chrome版本模拟器,开发者可以在不实际安装多个浏览器的情况下,快速切换到特定版本进行测试。 **...

    谷歌浏览器Chrome

    其次,Chrome的多进程架构是另一个关键特性。每个打开的标签页运行在独立的进程中,这提高了浏览器的稳定性,即使一个页面崩溃也不会影响其他页面的正常运行。同时,这种设计也提高了资源管理效率,减少了内存占用。...

    chrome homepage覆盖方法

    Chrome 浏览器是全球最流行的网页浏览工具之一,它以其快速、稳定和高度可定制的特性深受用户喜爱。在日常使用中,我们有时需要设置特定的页面为启动时的首页,也就是“主页”。本教程将详细介绍如何在Chrome中覆盖...

    chrome99.0.4844.51以及chrome driver

    Chrome浏览器是Google开发的一款流行的网页浏览器,以其稳定性和高性能赢得了全球用户的喜爱。版本号99.0.4844.51代表了这个特定版本的Chrome,它可能包含了安全更新、性能优化以及对Web标准的支持增强。"Chrome ...

    chrome 调用本地exe

    注,chrome 通过注册表注册表 只能调用本地的 exe 或者bat文件,不能调用 ppt word 这样的问题,所以我用VB 写了一个exe 可以接收调用参数,这样只许注册一次就可以通过传参打开所有课执行文件了 由于1.exe是后台...

Global site tag (gtag.js) - Google Analytics