Java에서 스레드를 올바르게 중지하는 솔루션이 필요합니다.
나는이 IndexProcessor
실행 가능한 인터페이스를 구현하는 클래스를 :
public class IndexProcessor implements Runnable {
private static final Logger LOGGER = LoggerFactory.getLogger(IndexProcessor.class);
@Override
public void run() {
boolean run = true;
while (run) {
try {
LOGGER.debug("Sleeping...");
Thread.sleep((long) 15000);
LOGGER.debug("Processing");
} catch (InterruptedException e) {
LOGGER.error("Exception", e);
run = false;
}
}
}
}
그리고 ServletContextListener
스레드를 시작하고 중지하는 클래스가 있습니다.
public class SearchEngineContextListener implements ServletContextListener {
private static final Logger LOGGER = LoggerFactory.getLogger(SearchEngineContextListener.class);
private Thread thread = null;
@Override
public void contextInitialized(ServletContextEvent event) {
thread = new Thread(new IndexProcessor());
LOGGER.debug("Starting thread: " + thread);
thread.start();
LOGGER.debug("Background process successfully started.");
}
@Override
public void contextDestroyed(ServletContextEvent event) {
LOGGER.debug("Stopping thread: " + thread);
if (thread != null) {
thread.interrupt();
LOGGER.debug("Thread successfully stopped.");
}
}
}
그러나 바람둥이를 종료하면 IndexProcessor 클래스에서 예외가 발생합니다.
2012-06-09 17:04:50,671 [Thread-3] ERROR IndexProcessor Exception
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at lt.ccl.searchengine.processor.IndexProcessor.run(IndexProcessor.java:22)
at java.lang.Thread.run(Unknown Source)
JDK 1.6을 사용하고 있습니다. 따라서 질문은 다음과 같습니다.
스레드를 중지하고 예외를 발생시키지 않는 방법은 무엇입니까?
추신 : 나는 .stop();
더 이상 사용되지 않기 때문에 방법 을 사용하고 싶지 않습니다.
InterruptedException
은 ibm.com/developerworks/library/j-jtp05236 에서 찾을 수 있습니다 .
InterruptedException
. 이것이 내가 생각하는 것이지만 표준 방법이 어떻습니까?