打印前完成线程完成

时间:2015-01-29 08:38:36

标签: java multithreading buffer

在执行某些代码时,我正在写一个文件(Java)。您可以在下面找到由JVM调用的“线程B”执行的代码。

writer = new PrintWriter(new BufferedWriter(new FileWriter("table.csv")));

(...)


while ( (m_bEnExecution) && (!m_bFinTestRules) ) {

   //Calculate new rule
   CalculateNewRule(writer);
}

writer.close();

在CalculateNewRule方法中,创建了一个新的AssociationRule实例,它将接收writer作为实例变量。 AssociationRule中的一个功能是打印。

writer.println(outputRule);
writer.flush();

问题似乎是这个函数是由一个AWT线程调用的,并且除非我明确强制执行线程,否则将永远不会写入要写入文件的最后一行,在CalculateNewRule(writer)方法中。在while循环之后停止。对问题可能是什么的任何想法?有没有优雅的方法来处理这个问题?

在一个答案中,我被建议将打印线程设置为守护程序线程,但我不知道如何在该特定线程上执行此操作。

3 个答案:

答案 0 :(得分:1)

在此线程完成之前,调用线程可能会越过。如果是这种情况,请使用守护程序线程。 提供更多详细信息,也许我们可以提供帮助。

答案 1 :(得分:1)

是“(m_bEnExecution)&&(!m_bFinTestRules)”总是等于真?

我建议如下:

try {
  while ( (m_bEnExecution) && (!m_bFinTestRules) ) {

    //Calculate new rule
    CalculateNewRule(writer);
    writer.flush();
  }
}
catch (Exception e) {
  e.printStackTrace();
}
finally {
  writer.close();
}

但是你仍然需要确保你不会进行无限循环。

答案 2 :(得分:0)

无论如何,你提供的代码不多。

你是什么意思:

  

强制执行线程停止

您正在使用BufferedWriter,除非您flushclose等作者,您不确定它是否已将所有内容写入缓冲区。

如果您想确保选择其中一种方法。