gpt4 book ai didi

java - 如何使用 ScheduledExecutorService 强制创建单线程并避免多线程

转载 作者:行者123 更新时间:2023-12-02 11:18:06 25 4
gpt4 key购买 nike

我只想在进入welcome.jsp页面时执行一次以下JAVA代码。

欢迎.jsp:

<%WeeklyScheduledMail wsm = WeeklyScheduledMail.INSTANCE;
wsm.startThread(); %>

因此,如果用户在服务器启动后访问该网站,则该代码只能使用一次,而其他登录并访问welcome.jsp的用户将不会执行该JAVA代码。

首先,我尝试用枚举来实现单例模式,我认为这就足够了,但它不起作用。我还尝试了方法的 Synchronized 关键字,但没有任何结果...

我确信我做错了什么,或者有更好的方法来做我想做的事。

部分代码:

WeeklyScheduledMail.java:

public enum WeeklyScheduledMail{

INSTANCE;

public void startThread() {

ScheduledExecutorService scheduler =
Executors.newSingleThreadScheduledExecutor();

Runnable task = new TaskSendEmail();
int initialDelay = 0;
int periodicDelay = 10;
scheduler.scheduleAtFixedRate(task, initialDelay, periodicDelay,
TimeUnit.SECONDS);

}
}

TaskSendEmail.java:

public class TaskSendEmail implements Runnable{

public void run() {
System.out.println("Hello: "+System.currentTimeMillis());
}
}

最佳答案

您正在研究运行应用程序初始化代码的错误概念。 JSP 和其他向用户公开的资源并不是为此而设计的。即使您可以强制执行一些延迟初始化逻辑,仍然会有可避免的开销。

您正在寻找的内容由 JavaEE 提供:a context listener ,在应用程序启动时调用一次,以通知您的应用程序上下文已初始化:

public class MyContextListener implements javax.servlet.ServletContextListener {

private static fWeeklyScheduledMail wsm =
weeklyScheduledMail.INSTANCE;

@Override
public void contextInitialized(ServletContextEvent sce) {
wsm.startThread();
}

@Override
public void contextDestroyed(ServletContextEvent sce) {
wsm.stopThread();
}
}

然后必须在 web.xml 部署描述符中(在 web-app 下)注册此监听器:

<listener>
<listener-class>my.packg.MyContextListener</listener-class>
</listener>

上面的代码和配置将使您的计划在应用程序启动时运行一次。

关于java - 如何使用 ScheduledExecutorService 强制创建单线程并避免多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50129077/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com