繁体   English   中英

Java Thread没有清理

[英]Java Thread not cleaning up

我目前正在尝试编写一个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();
}

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包。 它为多线程应用程序提供了许多有用的工具。

使用finally块添加刷新指令。

所有其他评论都很好,我只想添加 - 确保在关闭它们之前在输出流上调用flush()。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM