我目前正在尝试编写Logger样式线程。我没有使用现有的API,因为这部分是一项改进我的线程的练习。
当线程被中断时,我需要它正常关闭,刷新最后一个排队的消息并关闭文件流。
目前,它关闭但消息通常仍在队列中,我担心文件流没有正常关闭。
这是我的跑步()
while(!shutdown){
writeMessages();
try{
Thread.sleep(5000);
}
catch (InterruptedException e) {
}
}try {
writeMessages();
} catch (CustomException e1) {
e1.printStackTrace();
}
try {
logFile.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
errFile.close();
} catch (IOException e) {
e.printStackTrace();
}
答案 0 :(得分:2)
Java有非常巧妙的方法来关闭线程。它被称为中断标志。如果要中断线程,只需编写以下代码:
thread.interrupt();
thread.join();
在后台线程的Runnable
中,您应检查中断标志并相应地执行操作。如果你希望线程能够存活直到留下消息,你可以按照以下方式进行操作(我假设你有一些方法可以检查是否有任何消息。在我的情况下它是BlockingQueue
):
Thread self = Thread.currentThread();
BlockingQueue<String> messages = ...;
while (!self.isInterrupted() || !messages.isEmpty()) {
try {
String message = messages.take();
writeMessage(message);
} catch (InterruptedException) {
self.interrupt();
}
}
还有一件事。在请求线程关闭后,应确保消息未添加到队列中或在写入线程之前关闭所有生成消息的线程。这也可以检查线程中断标志(您需要知道对编写器线程的引用):
public void addMessage(String message) {
if (thread.isInterrupted() || !thread.isAlive()) {
throw new IllegalStateException();
}
messages.add(message);
}
另外,我建议您查看java.util.concurrent
包裹。它为多线程应用程序提供了许多有用的工具。
答案 1 :(得分:0)
使用finally块添加刷新说明。
答案 2 :(得分:0)
所有其他评论都很好,我只想添加 - 确保在关闭它们之前在输出流上调用了flush()。