【发布时间】:2013-10-06 10:32:59
【问题描述】:
我正在尝试通过 Java 中的多个线程将一些内容写入文件。每个线程读取不同的输入文件,进行一些计算并将一些(不同的)内容写入公共输出文件。问题是最后,输出文件只包含最后一个终止线程写入的内容,而不包含来自其他线程的内容。线程的相关代码 -
public void run()
{
try
{
File file = new File("/home/output.txt");
if (!file.exists())
{
file.createNewFile();
}
FileWriter fw = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
BufferedReader br = new BufferedReader(new FileReader(inputfile)); // each thread reads a different input file
String line="";
while((line=br.readLine())!=null)
{
String id = line.trim(); // fetch id
StringBuffer sb = processId(userId); // process id
synchronized(this){
bw.write(sb.toString() + "\n"); // write to file
}
}
bw.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
如何让所有线程将其内容写入公共文件?
【问题讨论】:
-
您必须附加到现有文件(
FileOutputStream有一个布尔标志)。但是您还必须编写synchronized,以确保同时只有一个线程写入。 -
如果可以使用StringBuilder就不要使用StringBuffer。在这种情况下 processId() 可以返回一个字符串。
-
您需要在所有线程中打开文件一次并协调他们的写作。否则你很可能会弄得一团糟。我建议你有一个单线程执行器并向它提交任务以写入文件。这将确保单线程写入。
-
我正在使用同步块,请查看我的编辑。它还会引起问题吗?
标签: java multithreading