JavaWeb 服务启动时,在后台启动加载一个线程。

目前,我所掌握的一共有两种方法,第一种是监听(Listener),第二种是配置随项目启动而启动的Servlet。

下面对这两种方法做一简单的介绍,(Mark一下,防止以后急用又忘记了):

  1. 监听(Listener)
    首先,我们创建一个监听的类,继承ServletContextListener,如下:

    [java] view plain copy
    1. package com.wxp.thread;
    2. import javax.servlet.ServletContextEvent;
    3. import javax.servlet.ServletContextListener;
    4. /**
    5. * Listener的方式在后台执行一线程
    6. *
    7. * @author Champion.Wong
    8. *
    9. */
    10. public class MyListener implements ServletContextListener {
    11. private MyThread myThread;
    12. public void contextDestroyed(ServletContextEvent e) {
    13. if (myThread != null && myThread.isInterrupted()) {
    14. myThread.interrupt();
    15. }
    16. }
    17. public void contextInitialized(ServletContextEvent e) {
    18. String str = null;
    19. if (str == null && myThread == null) {
    20. myThread = new MyThread();
    21. myThread.start(); // servlet 上下文初始化时启动 socket
    22. }
    23. }
    24. }
    25. /**
    26. * 自定义一个 Class 线程类继承自线程类,重写 run() 方法,用于从后台获取并处理数据
    27. *
    28. * @author Champion.Wong
    29. *
    30. */
    31. class MyThread extends Thread {
    32. public void run() {
    33. while (!this.isInterrupted()) {// 线程未中断执行循环
    34. try {
    35. Thread.sleep(2000); //每隔2000ms执行一次
    36. } catch (InterruptedException e) {
    37. e.printStackTrace();
    38. }
    39. //           ------------------ 开始执行 ---------------------------
    40. System.out.println("____FUCK TIME:" + System.currentTimeMillis());
    41. }
    42. }
    43. }

    然后,在web.xml中配置如下:

    [html] view plain copy
    1. <listener>
    2. <listener-class>com.wxp.thread.MyListener</listener-class>
    3. </listener>

    OK,启动项目,我们可以在控制台看到隔时间段输出的文字内容。

  2. 使用Servlet,在项目启动的时候启动它。
    首先,创建一个Servlet,继承HttpServlet

    [java] view plain copy
    1. package com.wxp.thread;
    2. import java.io.IOException;
    3. import javax.servlet.ServletException;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import com.ite.common.Constants;
    8. public class MyServlet extends HttpServlet{
    9. private static final long serialVersionUID = 1L;
    10. private MyThread1 myThread1;
    11. public MyServlet(){
    12. }
    13. public void init(){
    14. String str = null;
    15. if (str == null && myThread1 == null) {
    16. myThread1 = new MyThread1();
    17. myThread1.start(); // servlet 上下文初始化时启动 socket
    18. }
    19. }
    20. public void doGet(HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse)
    21. throws ServletException, IOException{
    22. }
    23. public void destory(){
    24. if (myThread1 != null && myThread1.isInterrupted()) {
    25. myThread1.interrupt();
    26. }
    27. }
    28. }
    29. /**
    30. * 自定义一个 Class 线程类继承自线程类,重写 run() 方法,用于从后台获取并处理数据
    31. *
    32. * @author Champion.Wong
    33. *
    34. */
    35. class MyThread1 extends Thread {
    36. public void run() {
    37. while (!this.isInterrupted()) {// 线程未中断执行循环
    38. try {
    39. Thread.sleep(2000);
    40. } catch (InterruptedException e) {
    41. e.printStackTrace();
    42. }
    43. // ------------------ 开始执行 ---------------------------
    44. System.out.println("____FUCK TIME:" + System.currentTimeMillis());
    45. }
    46. }
    47. }

    然后,在web.xml中配置

    [html] view plain copy
    1. <!-- LISTENER FOR THREAD -->
    2. <servlet>
    3. <servlet-name>MyListener</servlet-name>
    4. <servlet-class>com.ite.wxp.MyServlet</servlet-class>
    5. <load-on-startup>9</load-on-startup><!-- 数字越小,启动的优先级越高,必须大于0 -->
    6. </servlet>
    7. <servlet-mapping>
    8. <servlet-name>MyListener</servlet-name>
    9. <url-pattern>/test</url-pattern>
    10. </servlet-mapping>

    OK。启动项目,依然可以看到如图所示:

其中,Listener的方式,该线程肯定是项目中首先启动的,优先于任何一个Servlet。而Servlet的方式,可以设置与其它Servlet启动的顺序。如果有时候需要首先启动一个Servlet或者它们之间的启动顺序有特殊要求的时候,这个就很有作用了。

转载于:https://www.cnblogs.com/leiandjing/p/7883726.html

开启服务器时启动线程相关推荐

  1. 开启服务器,自动加载类是否需要开辟新的线程研究

    有些应用需要在开启服务器的时候自动先加载自己写好的类.比如监听串口通信等等. 那么在开启服务钱对类的加载是否需要开辟一个新的线程呢.下面对该想法做了一下测试. 1.首先在web.xml添加要加载的类: ...

  2. win10未能配置dhcp服务器,win10系统登录服务器时提示DHCP无法启动的解决方法

    DHCP Client为动态分配网址的服务,用户们如果要启动热点,就必须要开启dhcp服务器,有win10系统用户遇到登录服务器时发现提示DHCP无法启动,这是怎么回事呢?下面小编就和大家介绍win1 ...

  3. Django启动服务器时,报错mysql的2059错误的原因。

    当启动django自带的服务器时,报错2059: > _mysql_exceptions.OperationalError: (2059, ) > django.db.utils.Oper ...

  4. JavaWeb 项目时 启动一个线程

    介绍:最近在项目中,需要在启动项目时启动一个线程进行业务操作,在网上查找资料后准备采取监听的实现方式. 1首先创建一个类MqMsgTransformationListener 集成ServletCon ...

  5. 无法在Web服务器上启动调试。与Web服务器通信时出现身份验证错误

    使用Visual Studio 2005(Visual Studio 2008亦存在此问题)调试设置了主机头的网站时出现如下错误信息: --------- Microsoft Visual Studi ...

  6. 启动线程时使用 start 而不是 run

    今天团队里面的妹子问阿粉,为什么在启动线程的时候,都使用 start 方法,而不是 run 方法呢 还好阿粉平时一直有在学习,要不真的被妹子问住了 在多线程中,如果想让一个线程启动,你使用的方法一定是 ...

  7. 网站服务器需要几核心几线程,使用高防服务器时CPU的核心、线程数量和主频越高越好吗...

    在全球互联网网络攻击频发的时代,高防服务器作为对服务器安全需求较高的用户来说已经成为了用户对网络攻击尤其是应对DDOS攻击的最基本需求和选择.高防服务器用户在选择高防服务器时主要考虑的是高防服务器的防 ...

  8. 富士通服务器怎么配置u盘装系统,富士通笔记本用绿叶u盘装系统时启动菜单找不到u盘选项怎么办...

    富士通笔记本用绿叶u盘装系统时启动菜单找不到u盘选项怎么办?最近有用户跟小编反映,利用绿叶u盘给富士通笔记本安装系统,按f12快捷键进入启动菜单,但是却发现没有u盘启动项, 这是怎么回事呢?出现这个问 ...

  9. 应用程序进程(二):启动线程池

    多线程并发知识库 JAVA线程实现/创建的四种方式 1.继承Thread类 Thread类本质上是实现了Runnable接口的一个实例,代表一个线程的实例.启动线程的唯一方法就是通过Thread类的s ...

最新文章

  1. 关系的三类完整性约束的描述
  2. javascript元素跟随鼠标在指定区域运动
  3. 日志文件列表 读书笔记《Linux 系统管理技术手册(第二版)》
  4. c++构建工具之cmake使用小结
  5. cometoj contest 6(记录型博客)
  6. uva 1611——Crane
  7. can通讯bdc_宝马总线K-CAN3和K-CAN4常见案例
  8. python格式化输出区别_python格式化输出的区别
  9. C程序设计语言现代方法13:字符串
  10. Minix的系统调用
  11. html svg 在线编辑器,用于矢量图形的SVG在线编辑器
  12. Lua C API中文函数手册
  13. vscode 是干什么用的_vscode是干嘛用的
  14. 单细胞测序最新研究进展(2021年7月)
  15. 关于计算机系统的夺命12问,你能坚持到第几问?
  16. eclipse 64位 免安装_超详细:64位Linux下安装PS模拟器ePSxe
  17. php反序列化漏洞中当不存在__invoke时的一种利用思路
  18. matlab模拟线圈电磁场,利用MATLAB的PDE工具箱对电场和磁场进行模拟
  19. 【Maven】maven下载网址进不去处理方法
  20. 无线局域网(WLAN)

热门文章

  1. ORA-12154: TNS:could not resolve the connect identifier spec
  2. 最长单调递增子序列 [转]
  3. Ubantu Server 安装
  4. PAT1057. 数零壹
  5. c语言位运算符怎么用,傻傻分不清
  6. atoi和itoa函数实现
  7. oracle数据库 bug,Oracle bug之vipca无法执行问题的解决
  8. APP自动化测试系列之Appium介绍及运行原理
  9. 图神经网络可解释性Slide:GNNExplainer: Generating Explanations for Graph Neural Networks
  10. Uphold:在最终被判定为证券前不会退市XRP