我试图通过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();
}
}
如何让所有线程将其内容写入公共文件?
答案 0 :(得分:16)
使用使用追加模式的FileWriter
的构造函数
FileWriter fw = new FileWriter(file.getAbsoluteFile(), true);
答案 1 :(得分:5)
拥有一个文件编写器线程,可以从阻塞队列中读取并写入文件。所有其他20个线程只会将数据放入阻塞队列。这将防止20个编写器线程之间的争用。
答案 2 :(得分:3)
与您的代码相关的几点:
1。您创建FileWriter
的方式不正确。如果要将数据附加到文件,请使用包含其他boolean
参数的构造函数(将其设为true
):
public FileWriter(File file,boolean append) throws IOException
例如:
FileWriter fw = new FileWriter(file.getAbsoluteFile(),true);
2。您正在谈论将共享公共文件的多个线程,但我在代码中看不到任何同步块。使用同步可确保一次只有一个线程可以访问共享资源。
答案 3 :(得分:2)
FileWriter fw = new FileWriter(file.getAbsoluteFile(),true);
表示追加模式。
答案 4 :(得分:-2)
我是新手。 我可能错了!但是你的代码可能也可能不起作用。这是Runnable或线程的运行吗?请注意:
MyClass implements Runnable {
public void run() {
....synchronized(this)..
}
}
Thread t1 = new Thread(new MyClass());
Thread t2 = new Thread(new MyClass());
我们中的许多人都这样做(我做了,做到了:),是的!每个线程将获得对不同obj的锁定,并且您可能最终得到意外结果,除非操作系统使用某种机制将写入同步到同一文件(我不知道)。如果确实如此,那么你的同步是无用的(无论如何在我的例子中都是无用的),如果它不是你很漂亮....另外作为一个注释,可能有另一个进程使用这个output.txt我们没有想法...复杂的东西,至少对我而言
我的观点是,如果你有一个类分享, MUTABLE , STATE 。 (现在让我们忘记synchronized和static)
MyClass是否有州?不,它是否共享?不,不是我的例子。它会起作用吗?不是这样的。可能是这样的吗?
MyClass mc = new MyClass()
Thread t1 = new Thread(mc);
Thread t2 = new Thread(mc);
PS:我忘记在每个帖子上调用start。