gpt4 book ai didi

java - 使用 contextDestroyed 干预长时间运行的线程

转载 作者:行者123 更新时间:2023-11-28 23:06:00 25 4
gpt4 key购买 nike

我需要展示一些代码来解释我的问题。

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class ServletContextAttribListener implements ServletContextListener
{
private ServletContext context = null;
private MyThread myThread = new MyThread(true);

// This method is invoked when the Web Application
// is ready to service requests

public void contextInitialized(ServletContextEvent event)
{
this.context = event.getServletContext();
// Output a simple message to the server's console
myThread.start();
System.out.println("The Simple Web App. Is Ready");
}

public void contextDestroyed(ServletContextEvent event)
{
// Output a simple message to the server's console
System.out.println("The Simple Web App. Has Been Removed");
myThread.setB(false);
this.context = null;
}

public class MyThread extends Thread
{
private boolean b;

public MyThread(boolean b)
{
this.b = b;
}

@Override
public void run()
{
int i = 0;
int j = 0;
while (b)
{
//This part is important
for (i = 0; i < 1000000; i++)
{
}
//
j++;
}
System.out.println("Thread stopped i:->" + i + " j:->" + j);
}

public boolean isB()
{
return b;
}

public void setB(boolean b)
{
this.b = b;
}
}
}

如您所见,它是一个非常小的虚拟程序。我没有写 web.xml,我只是使用 listener-class。当我部署war,启动和停止tomcat时,程序的输出是:

The Simple Web App. Is Ready
The Simple Web App. Has Been Removed
Thread stopped i:->1000000 j:->17296

如您所见,在 for 循环中 i 为 1000000。我想要的是打破循环,无论 i 是 1000000 还是小于它。

你可以说我可以在 for 循环中使用 b 条件和 i<1000000 但在我的真实程序中我没有那个 for 循环。我只是像这里一样有一个 while 循环,但其中有很多行代码。我不想在一段时间内每次都检查 b

顺便说一句,我不能使用 sleep /中断。

最佳答案

没有线程的协作,就没有干净的方法来停止线程。因此,如果您需要尽快停止,则必须尽可能频繁地检查停止标志(在您的示例中为 b)。

顺便说一句,b 标志应该是volatile,否则你的线程可能永远不会停止。

关于java - 使用 contextDestroyed 干预长时间运行的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9395896/

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