Java线程队列与线程池

标签 java multithreading input linked-list output

我编写了一个程序,它使用单个线程将数据从文件读取到链接列表中,我们将其称为 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/

相关文章:

java - 一对多关系中的 CascadeType 问题

java - 复选框树未按预期工作

java - JSP:在文件上传时获取 MIME 类型

ruby - Ruby Enterprise 是否使用绿色线程?

c++ - MFC C++ 在回调函数中编辑 Windows 控件

javascript - 使用正则表达式和 jQuery 使输入接受一个字母

html - 仅当上一个文件输入不为空时才显示文件输入

objective-c - 在 Cocoa Status Bar 应用程序中接收 keyDown 和 keyUp 事件

java - 静态初始化 block

multithreading - 如何将 Rendezvous 函数放入 jmeter 线程或用户中以实现特定函数