【发布时间】: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<Integer>来帮助解决这种消费者/生产者场景。但是,您使用更原始的方法很接近:您(在将它们注释掉之前)将synchronized(d)包裹在消费者和生产者的代码中,但您没有包含相关的wait()和notify()方法来 co - 协调单次读取,后跟单次写入。这种原始方法强制您锁定每一次读/写,而阻塞队列不需要进一步同步。
标签: java multithreading file producer-consumer