我编写了一个程序,它使用单个线程将数据从文件读取到链接列表中,我们将其称为 LL1。由此我创建了一个线程池,它为每个线程分配一个处理任务,该任务从 LL1 读取数据并将其计算结果输出到一个新的链表。 由此,我需要将每个线程的新链接列表输出到单个文件中。我试图按顺序 block 输出每个链表,以便线程不会混合数据,因此我使用了同步点,如下所示:
public synchronized void appendContents(List<Vector2> output1) {
try {
sFileName = outFilePath + "\\file" +fileCount+ ".cntr";
File oFile = new File(sFileName);
if (!oFile.exists()) {
oFile.createNewFile();
}
if (oFile.canWrite()) {
//BufferedWriter oWriter = new BufferedWriter(new FileWriter(sFileName, true));
FileWriter wstream = new FileWriter(oFile, true);
BufferedWriter outWriter = new BufferedWriter(wstream);
for(int i = 0; i < output1.size(); i++)
{
//replace the space marker values with a newline
if(output1.get(i).y == -200.0){
outWriter.newLine();
}else{
outWriter.write(String.valueOf(output1.get(i).x) + " " + String.valueOf(output1.get(i).y) + " " + String.valueOf(interval));
outWriter.newLine();
}
}
outWriter.close();
}
}
catch (IOException oException) {
throw new IllegalArgumentException("Error appending/File cannot be written: \n" + sFileName);
}
我面临的问题是数据没有按我需要的顺序输出,即
list1 value list1 value
list1 value _______________\ list2 value
list1 value ________________\ list1 value
list2 value RATHER THAN ____/ list3 value
list2 value ---------------/ list2 value
list2 value list1 value
list3 value list2 value
list3 value list1 value
list3 value list3 value
list3 value list3 value
如果有人能让我朝着正确的方向迈出一步,我将不胜感激。 谢谢,
jack
最佳答案
synchronized
的目的是在共享资源上进行同步,以便一次只有一个 Thread
可以访问临界区。我假设您生成三个 Thread
实例,每个实例都在自己的对象上调用 appendContents
。
synchronized
方法隐式同步 this
,但由于所有三个 Thread
都在不同的对象上同步,即。不同的 this
,没有任何东西可以阻挡它们。
关于Java线程队列与线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19287195/