【问题标题】:Reading and writing a file using threads in java在java中使用线程读取和写入文件
【发布时间】:2018-05-14 22:11:09
【问题描述】:

我正在尝试从一个文件中读取 5000 个整数,并使用两个线程将这些整数写入另一个文件。这是我的代码:

public class data {
    int value;
}
import java.util.*;
import java.io.*;
public class oku implements Runnable {

    data d;
    public oku(data d){
        this.d=d;
    }

    public synchronized void run(){
        File f= new File("/home/ayyuce/Desktop/ali.dat");
        try {
            Scanner sc= new Scanner(f);
            while(sc.hasNextInt()) {
                //synchronized(d) {
                d.value=sc.nextInt();
            }
            //}
            sc.close();
        } catch(Exception ex){ }
    }

}
import java.util.*;
import java.io.*;
public class yaz implements Runnable {
    data d;

    public yaz(data d) {
        this.d=d;
    }

    public synchronized void run() {
        File f= new File("/home/ayyuce/Desktop/veri.dat");
        try {
            PrintWriter p = new PrintWriter(f);
            for(int i=0; i<5000;i++){
                //synchronized(d){
                p.println(d.value);
                //System.out.println(d.value);
            }
            //}
            p.close();
        } catch(Exception ex){ }
    }
}
public class main_class {
    public static void main(String[] args) {
        data d= new data();
        //d.value=100;
        oku o= new oku(d);
        yaz y= new yaz(d);
        Thread t1= new Thread(o);
        Thread t2= new Thread(y);
        t1.start();
        t2.start();
    }
}

我使用了生产者消费者算法。它从文件中读取并将整数写入数据类中的值,然后从数据类中读取,写入文件。但它不能正常工作。它将零写入文件。我的代码有什么问题?

谢谢

【问题讨论】:

  • synchronized void run 没有意义。
  • 不要吞下异常。
  • 有什么问题?
  • 没有阻塞/等待——“写”线程可以在任何时候愉快地写它想要的东西,而不用考虑“读”线程正在做什么,“读”线程不知道“写入”线程何时实际获取了一个值,从而使“读取”线程可以安全地读取下一个值。我认为您需要对“阻塞队列”进行更多研究
  • 正如 MadProgrammer 所说,Java 提供了BlockingQueue&lt;Integer&gt; 来帮助解决这种消费者/生产者场景。但是,您使用更原始的方法很接近:您(在将它们注释掉之前)将 synchronized(d) 包裹在消费者和生产者的代码中,但您没有包含相关的 wait()notify() 方法来 co - 协调单次读取,后跟单次写入。这种原始方法强制您锁定每一次读/写,而阻塞队列不需要进一步同步。

标签: java multithreading file producer-consumer


【解决方案1】:

如果是我,我会创建一个单独的对象来跟踪文件的读取和写入。

public class fileHandler{
    File f;
    printWriter p

    public void fileHandler(String filename){
        f = new File(filename);
        p = new printWriter(f);
    }

    public void write(String str){
        synchronized(p){
            p.println(str);
        }
    }
}

然后从每个线程单独调用 write。这样您就不会有多个线程同时写入同一个文件。

【讨论】:

    猜你喜欢
    • 2011-06-09
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 2013-03-25
    • 1970-01-01
    相关资源
    最近更新 更多