我正在使用ExecutorService
让多个线程将文本写入文件,但是我无法设法同步run()
方法,而不是按行排列正确的字符串我问,我有字符串中所有字符的混合,因为它们是同时写的。
import java.io.BufferedReader
...
class WriteDns implements Runnable {
File file;
String text;
WriteDns(File file, String text) {
this.file = file;
this.text = text;
}
public void run() {
synchronized (this) {
try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(file)))) {
bw.write(turnDns() + "\n");
} catch (IOException e) {
System.out.println("Error");
}
}
}
public String turnDns() {
int space = text.indexOf(' ');
String ip = text.substring(0, space);
String theRest = text.substring(space);
String temp = ip;
try {
ip = InetAddress.getByName(ip).getHostName();
if (ip == temp)
return "NotFound " + theRest;
return ip + " " + theRest;
} catch (UnknownHostException e) {
System.out.println("Error in change");
return "-changeErr " + theRest;
}
}
}
public class Main00 {
static File oldFile = new File("oldfile.txt");
public static void main(String[] args) {
readLines();
}
public static void readLines() {
try (BufferedReader br = new BufferedReader(new FileReader(oldFile))) {
File f = new File("file.txt");
ExecutorService service = Executors.newFixedThreadPool(10);
for (String t = br.readLine(); t != null; t = br.readLine()) {
service.execute(new WriteDns(f, t));
}
service.shutdown();
} catch (IOException e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:8)
您正在this
进行同步,但是您为每个线程创建了一个新的线程工作者实例,因此每个线程都会自行锁定并且永远不会等待任何其他线程。您需要锁定一个对所有线程可见的对象,可能是静态对象,或者在实例化WriteDns
时传入锁定对象。
话虽如此,在一个文件上打开多个线程本质上容易出现像您遇到的问题,并且您从多个线程写入中获得的任何东西,因为您的瓶颈是您的存储介质而不是您的处理器。您应该让多个线程向一个专用的编写器线程提供信息/数据,该线程对您要写入的文件具有独占访问权限,如@FlorianSchaetz建议的那样。