为什么在包含servlet和;“工人”;Java中的线程

为什么在包含servlet和;“工人”;Java中的线程,java,multithreading,singleton,servlets,Java,Multithreading,Singleton,Servlets,我目前有一个web应用程序,其中我有servlet读取和写入ServletContext属性,我有“工作”线程(守护线程),这些线程在启动时被初始化,目前作为ServletContext对象的成员。 出于几个原因,我考虑改为“实现Runnable”,我有点被这样一个事实所困扰,即我需要一个servlet和非servlet可以用来相互交谈的公共资源,我觉得我有点被整个ServletContext范式所困扰。 如果有人能就为什么要使用ServletContext(我的方式或另一种方式)提供一些观点,

我目前有一个web应用程序,其中我有servlet读取和写入
ServletContext
属性,我有“工作”线程(守护线程),这些线程在启动时被初始化,目前作为
ServletContext
对象的成员。 出于几个原因,我考虑改为“实现
Runnable
”,我有点被这样一个事实所困扰,即我需要一个servlet和非servlet可以用来相互交谈的公共资源,我觉得我有点被整个
ServletContext
范式所困扰。 如果有人能就为什么要使用
ServletContext
(我的方式或另一种方式)提供一些观点,我将不胜感激,而且我正在考虑使用一个单例类,它将在启动时初始化,并且将是线程安全的,我将通过它路由servlet和非servlet的所有通信。 你觉得怎么样


感谢

Java Servlet容器实际上是一个易于管理的代码容器。servlet是具有非常明确定义的生命周期的组件,容器和组件之间也有非常明确定义的契约(也可以包括过滤器)

正如所规定的,web应用程序是一个被动反应系统

它是被动的,从某种意义上说,不允许(严格地)使用用户定义的线程。(某些容器可能不强制执行此限制,但通过生成自己的线程,您实际上已脱离保留,并且可能会发生不可预测的行为。)

它是反应式的,从某种意义上说,服务器上的活动(在您的代码库中)是响应请求而发生的,这些是典型的Servlet应用程序HTTP请求

ServletContext是容器中给定web应用程序的所有组件的共享上下文。此上下文在web应用程序激活时创建,在其停用时销毁。您可以使用ServletContextListener组件来钩住此生命周期,并获取有关生命周期事件的通知回调

<> P>如果你愿意继续在你的网络应用程序中保持活跃的元素,那么你可以考虑以下内容:

1-创建并注册组件以管理活动组件。在web应用启动/激活时,您将收到来自容器的回调。在这里,您可以启动线程组件。由于将向该组件传递对ServletContext的引用,因此可以将该引用传递给线程化组件

2-您的线程化组件类(无论是线程的扩展还是Runnable的实现)需要易于管理,因为您需要提供在ServletContextListener接收到上下文关闭回调时干净地关闭线程的方法。如果您能够对可运行任务进行形式化,则提供了所需的功能,因此您无需重新设计轮子


也就是说,您可能希望检查您的需求,从而检查您选择的设计和web容器平台。可能您真的需要更复杂的后端堆栈。

Java Servlet容器实际上是一个易于管理的代码容器。servlet是具有非常明确定义的生命周期的组件,容器和组件之间也有非常明确定义的契约(也可以包括过滤器)

正如所规定的,web应用程序是一个被动反应系统

它是被动的,从某种意义上说,不允许(严格地)使用用户定义的线程。(某些容器可能不强制执行此限制,但通过生成自己的线程,您实际上已脱离保留,并且可能会发生不可预测的行为。)

它是反应式的,从某种意义上说,服务器上的活动(在您的代码库中)是响应请求而发生的,这些是典型的Servlet应用程序HTTP请求

ServletContext是容器中给定web应用程序的所有组件的共享上下文。此上下文在web应用程序激活时创建,在其停用时销毁。您可以使用ServletContextListener组件来钩住此生命周期,并获取有关生命周期事件的通知回调

<> P>如果你愿意继续在你的网络应用程序中保持活跃的元素,那么你可以考虑以下内容:

1-创建并注册组件以管理活动组件。在web应用启动/激活时,您将收到来自容器的回调。在这里,您可以启动线程组件。由于将向该组件传递对ServletContext的引用,因此可以将该引用传递给线程化组件

2-您的线程化组件类(无论是线程的扩展还是Runnable的实现)需要易于管理,因为您需要提供在ServletContextListener接收到上下文关闭回调时干净地关闭线程的方法。如果您能够对可运行任务进行形式化,则提供了所需的功能,因此您无需重新设计轮子


也就是说,您可能希望检查您的需求,从而检查您选择的设计和web容器平台。可能您真的需要一个更复杂的后端堆栈。

嗨,alphazero,很抱歉,但我认为您并没有真正回答我的问题,因为我的主要难题是我应该在servlet和非servlet之间使用什么公共资源?我目前倾向于使用
Singleton
类作为
ServletContext
的仿制品,因此我不需要到处传递
ServletContext
这种难看的方法。(顺便说一句,我已经在实施你的大部分建议,这也是我说它没有真正回答我的问题的部分原因)我认为从回答中可以清楚地看出,没有sha这样的东西