Java线程没有清理

标签 java multithreading

我目前正在尝试编写一个记录器风格的线程。我没有使用现有的 API,因为这部分是为了改进我的线程处理。

当线程中断时,我需要它正常关闭,刷新最后一条排队消息并关闭文件流。

目前,它已关闭,但消息通常仍在队列中,我担心文件流没有正常关闭。

这是我的 run()

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包。它有很多适用于多线程应用程序的有用工具。

关于Java线程没有清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5767653/

相关文章:

java - 从不同的函数打印 ArrayList

java - java中如何避免在循环中频繁创建对象?

c++ - 使用 IOCP 时从两个线程调用 WSASend() 和 WSARecv() 是否安全?

ruby-on-rails - 使用 shoryuken 进行后台作业时如何确定并发(线程)?

c# - 在asp.net框架中等效于Ihostedservice的后台任务

c++ - QThread::msleep() 卡住程序

java - 贪吃蛇游戏中的 die() 方法用于有毒食物

java - 如果 int 变量等于 ArrayList 中的位置,则分配 ArrayList 元素

java - 在java中比较两个日期的最佳方法

java - 实现 java FixTreadPool 状态监听器