簡體   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