在执行某些代码时,我正在写一个文件(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循环之后停止。对问题可能是什么的任何想法?有没有优雅的方法来处理这个问题?
在一个答案中,我被建议将打印线程设置为守护程序线程,但我不知道如何在该特定线程上执行此操作。
答案 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
,除非您flush
,close
等作者,您不确定它是否已将所有内容写入缓冲区。
如果您想确保选择其中一种方法。