📄 shutdownexample.java
字号:
//5.3.3
public ShutdownExample extends HttpServlet
{
private int serviceCounter = 0;
private Boolean shuttingDown;
...
// serviceCounter
protected synchronized void enteringServiceMethod()
{
serviceCounter++;
}
protected synchronized void leavingServiceMethod()
{
serviceCounter--;
}
protected synchronized int numServices()
{
return serviceCounter;
}
//shuttingDown
protected setShuttingDown(Boolean flag)
{
shuttingDown = flag;
}
protected Boolean isShuttingDown()
{
return shuttingDown;
}
}
这个service方法每次在它进入时要增加,而在它返回退出时要减少:
protected void service(HttpServletRequest req£HttpServletResponse resp)
throws ServletException IOException
{
enteringServiceMethod();
try
{
super.service(req£resp);
} finally {leavingServiceMethod();}
}
destroy方法应当检查serviceCounter,如果存在长时间方式运行的话,设置变量shuttingDown。这个变量将会让那个正在处理请求的线程知道该结束了。destroy 方法应当等待这几个service 方法完成,这样就是一个清楚的关闭过程了。
public void destroy()
{
/*检查是否有线程在运行,如果有,告诉它们停止*/
if (numServices() > 0)
{
setShuttingDown(true);
}
/*等待它们停止*/
while(numService() > 0)
{
try{thisThread.sleep(interval);}
catch (InterruptedException e){}
}
}
long-running 方法如必要应当检查这个变量,并且解释它们的工作:
public void doPost(…)
{
…
for(i = 0; ((i < lotsOfStuffToDo) && !isShuttingDown()); i++)
{
try {partOfLongRunningOperation(i); } catch (InterruptedException e) {}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -