`
langgufu
  • 浏览: 2305532 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

web应用程序和它之中的线程问题(转载)

 
阅读更多

原文地址:http://coach.iteye.com/blog/854996

Web应用程序中调度器的启动和关闭问题

我们知道静态变量是ClassLoader级别的,如果Web应用程序停止,这些静态变量也会从JVM中清除。但是线程则是JVM级别的,如果你在Web 应用中启动一个线程,这个线程的生命周期并不会和Web应用程序保持同步。也就是说,即使你停止了Web应用,这个线程依旧是活跃的。正是因为这个很隐晦 的问题,所以很多有经验的开发者不太赞成在Web应用中私自启动线程。 

如果我们手工使用JDK Timer(Quartz的Scheduler),在Web容器启动时启动Timer,当Web容器关闭时,除非你手工关闭这个Timer,否则Timer中的任务还会继续运行! 

下面通过一个小例子来演示这个“诡异”的现象,我们通过ServletContextListener在Web容器启动时创建一个Timer并周期性地运行一个任务: 

Java代码   收藏代码
  1. //代码清单StartCycleRunTask:容器监听器  
  2. package com.baobaotao.web;  
  3. import java.util.Date;  
  4. import java.util.Timer;  
  5. import java.util.TimerTask;  
  6. import javax.servlet.ServletContextEvent;  
  7. import javax.servlet.ServletContextListener;  
  8. public class StartCycleRunTask implements ServletContextListener ...{  
  9.     private Timer timer;  
  10.     public void contextDestroyed(ServletContextEvent arg0) ...{  
  11.         // ②该方法在Web容器关闭时执行  
  12.         System.out.println("Web应用程序启动关闭...");  
  13.     }  
  14.     public void contextInitialized(ServletContextEvent arg0) ...{  
  15.          //②在Web容器启动时自动执行该方法  
  16.         System.out.println("Web应用程序启动...");  
  17.         timer = new Timer();//②-1:创建一个Timer,Timer内部自动创建一个背景线程  
  18.         TimerTask task = new SimpleTimerTask();  
  19.         timer.schedule(task, 1000L, 5000L); //②-2:注册一个5秒钟运行一次的任务  
  20.     }  
  21. }  
  22. class SimpleTimerTask extends TimerTask ...{//③任务  
  23.     private int count;  
  24.     public void run() ...{  
  25.         System.out.println((++count)+"execute task..."+(new Date()));  
  26.     }  
  27. }  


在web.xml中声明这个Web容器监听器:<?xml version="1.0" encoding="UTF-8"?> 
<web-app> 
 
    <listener> 
        <listener-class>com.baobaotao.web.StartCycleRunTask</listener-class> 
    </listener> 
</web-app> 

在Tomcat中部署这个Web应用并启动后,你将看到任务每隔5秒钟执行一次。 
运行一段时间后,登录Tomcat管理后台,将对应的Web应用(chapter13)关闭。 

转到Tomcat控制台,你将看到虽然Web应用已经关闭,但Timer任务还在我行我素地执行如故——舞台已经拆除,戏子继续表演: 

我们可以通过改变清单StartCycleRunTask的代码,在contextDestroyed(ServletContextEvent arg0)中添加timer.cancel()代码,在Web容器关闭后手工停止Timer来结束任务。 

Spring为JDK Timer和Quartz Scheduler所提供的TimerFactoryBean和SchedulerFactoryBean能够和Spring容器的生命周期关联,在 Spring容器启动时启动调度器,而在Spring容器关闭时,停止调度器。所以在Spring中通过这两个FactoryBean配置调度器,再从 Spring IoC中获取调度器引用进行任务调度将不会出现这种Web容器关闭而任务依然运行的问题。而如果你在程序中直接使用Timer或Scheduler,如不 进行额外的处理,将会出现这一问题。 

 

其实定时任务都是开启的线程,如果能把开启的线程都设置成守护线程,那么也行。

分享到:
评论

相关推荐

    《嵌入式Linux应用程序开发详解》之多线程编程

    嵌入式 Linux 应用程序开发详解之多线程编程 Linux 中的线程编程是指在 Linux 操作系统中使用线程来实现多任务处理的编程技术。线程是一种轻量级进程,它可以共享同一个进程的资源,例如文件描述符和信号处理。与...

    html5的Web线程

    HTML5的Web线程,全称为Web Workers,是HTML5引入的一个强大特性,旨在提高Web应用程序的性能和响应性。Web Workers允许在浏览器后台独立于主线程运行脚本,处理大量计算任务,避免了因为JavaScript执行阻塞而导致的...

    多线程定时器Web和Winform双版本

    在IT领域,多线程定时器是一个非常实用的工具,特别是在开发Web应用程序和Windows桌面应用(Winform)时。这个工具允许程序员在多个线程环境中设置定时任务,从而实现后台处理、定期检查更新或者执行一系列间隔操作...

    编写简单的HTTP 1.0客户端/服务器程序:.编写多线程Web服务器:编写简单的RMI程序

    总结来说,这个实验涵盖了HTTP基础、多线程Web服务器的实现以及Java RMI的应用,这些都是构建复杂网络应用程序的基础。每个部分都至关重要,理解和掌握它们对于成为一名合格的IT专业人士至关重要。通过实践,你可以...

    WebDelegate_线程(在Web中使用线程+委托)

    `WebDelegate_线程(在Web中使用线程+委托)`这个主题探讨的就是如何在Web应用中有效地利用线程和委托。 首先,线程是操作系统提供的一个基础概念,它代表程序中的执行单元。在Web应用中,我们可以创建新的线程来执行...

    Java多线程技术在WebGIS客户端小程序中的应用.pdf

    最后,Java多线程技术在WebGIS客户端小程序中的应用还涉及到线程安全和同步问题。由于多个线程可能同时访问和修改数据,这可能导致数据不一致的问题。为此,Java提供了synchronized关键字、锁机制等同步工具来保证...

    操作系统原理线程概念与应用 操作系统原理线程概念与应用

    1. 用户级线程:用户级线程由应用程序管理,操作系统内核对它们的创建、调度和销毁并不直接参与。用户级线程的切换速度快,但当某个线程遇到I/O阻塞时,整个进程的其他线程也会被阻塞。 2. 内核级线程:内核支持的...

    WEBAPI多线程并发测试工具

    Web API通常指的是应用程序接口,它们允许不同的服务之间进行通信,以实现数据交换和功能整合。多线程并发测试则是验证在多个线程同时访问API时,系统的性能、稳定性和正确性。 描述中的“WEB API 多线程并发测试...

    多线程web服务器

    在计算机程序设计中,多线程允许一个应用程序同时执行多个不同的任务,提高资源利用率和响应速度。在Web服务器中,多线程技术可以使得服务器同时处理多个客户端的请求,提升服务效率。C++标准库提供 `&lt;thread&gt;` ...

    Java Web应用开发项目教程(附电子教案,程序源代码,习题答案)

    5. **MVC(Model-View-Controller)设计模式**:在Java Web开发中,MVC模式被广泛应用于组织应用程序结构。了解模型、视图和控制器各自的角色,以及它们之间的交互,有助于构建清晰的项目架构。 6. **Struts框架**...

    PY版多线程webserver.rar

    `server2.exe`可能是使用`pyinstaller`工具打包后的Python应用程序,`pyinstaller`是一个用于将Python脚本转换为独立可执行程序的工具,这使得该Web服务器可以在不安装Python环境的机器上运行,极大地提高了其便携性...

    程序设计-基于Java的多线程Web服务器

    然而,从零开始编写多线程Web服务器是学习网络编程和并发处理的好方法,可以深入理解这些底层概念。 在压缩包中的"Server"文件可能是服务器的主类,它启动服务器监听端口,并可能包含了配置信息,如监听的IP地址和...

    多线程调用webservices

    在IT行业中,多线程调用Web服务是一种常见的性能优化技术,特别是在处理大量并发请求时。Web服务,通常指的是基于SOAP、REST等协议...通过深入理解这些概念和技术,开发者可以构建出能够应对高并发场景的健壮应用程序。

    开发线程安全的SpringWeb应用-pdf清晰

    教你怎么开发线程安全的SpringWeb应用.

    HTML5 Web Workers之网站也能多线程的实现

    例如,如果在Web应用中需要读取和处理一个非常大的本地文件,传统的做法可能会让整个页面卡死,而通过Web Workers可以将文件处理逻辑放在后台线程执行,主线程则负责接收处理进度和结果,这样既保证了操作的流畅性,...

    一个多线程示例程序及多线程常见问题介绍

    在IT领域,多线程是程序设计中的一个重要概念,它允许程序同时执行多个任务,显著提高了计算机系统的效率和响应速度。C++Builder是一款强大的集成开发环境(IDE),它支持C++语言,为开发者提供了创建多线程应用的...

    .Net线程的基础及问题

    .Net线程的基础及问题涉及到多个关键概念,包括线程创建、线程类型、异步编程、WinForm多线程、线程池、同步机制以及在Web和IIS环境中的线程应用。 首先,创建线程有多种方式。最常见的是通过`Thread`类,创建一个`...

    Android开发教程之使用 Web Workers 来加速您的移动 Web 应用程序--千锋培训

    【Android开发教程之使用Web Workers来加速您的移动Web应用程序】 Web Workers是HTML5引入的一项重要技术,它允许在Web应用程序中实现多线程处理,从而改善了JavaScript在移动设备上的性能。一直以来,JavaScript...

    用C++开发Web商用程序

    总之,用C++开发Web商用程序是一项挑战,但通过掌握上述关键知识点和工具,开发者可以充分利用C++的优势,创建出高效、安全且易于维护的Web应用程序。在实践中不断学习和迭代,是成为一名优秀的C++ Web开发者的...

    Linux下基于多线程的服务器程序设计.pdf

    在 Linux 下的多线程服务器程序设计中,需要使用互斥锁来解决线程间的同步问题。互斥锁是一种同步机制,用于保护共享资源免受多个线程的同时访问。Linux 提供了多种互斥锁机制,包括信号量、互斥锁、条件变量等。 ...

Global site tag (gtag.js) - Google Analytics