Хорошо использовать синхронизировать по java.io.File
Объект. Если вы хотите альтернативно читать и записывать этот Файловый объект с использованием двух потоков: один для чтения и один для записи.Синхронизация по объекту java.io.File
public class PrintChar {
File fileObj;
public void read() {
while (true) {
synchronized (this) {
readFile();
notifyAll();
try {
wait();
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName()
+ " throws Exception");
e.printStackTrace();
}
}
}
}
public void write(String temp) {
while (true) {
synchronized (this) {
writeFile(temp);
notifyAll();
try {
wait();
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName()
+ " throws Exception");
e.printStackTrace();
}
}
}
}
public void setFileObj(File fileObj) {
this.fileObj = fileObj;
}
public void readFile() {
InputStream inputStream;
try {
inputStream = new FileInputStream(fileObj);
// Get the object of DataInputStream
DataInputStream in = new DataInputStream(inputStream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine;
// Read File Line By Line
while ((strLine = br.readLine()) != null) {
// Print the content on the console
System.out.println(strLine);
}
in.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void writeFile(String temp) {
BufferedWriter bw;
try {
bw = new BufferedWriter(new FileWriter(fileObj, true));
bw.write(temp);
bw.newLine();
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
final PrintChar p = new PrintChar();
p.setFileObj(new File("C:\\sunny.txt"));
Thread readingThread = new Thread(new Runnable() {
@Override
public void run() {
p.read();
}
});
Thread writingThread = new Thread(new Runnable() {
@Override
public void run() {
p.write("hello");
}
});
Thread Randomizer = new Thread(new Runnable() {
@Override
public void run() {
while (true)
try {
Thread.sleep(500000);
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName()
+ " throws Exception");
e.printStackTrace();
}
}
});
readingThread.start();
writingThread.start();
Randomizer.start();
}
}
В коде выше я использовал Синхронное (это), Могу ли я использовать Synchronize (fileObj) ??
Еще один решение, которое я получил от одного из моих профессоров инкапсулировать чтения и записи в объектах и толкать их в ФИФО после каждой операции, если кто-нибудь подробно остановиться на этом
Пожалуйста, отредактируйте ваш вопрос, чтобы предоставить нам более подробную информацию. Показать пример кода? Как вы читаете или записываете файл? – Gray
Ваш профессор предлагает вам избежать этой проблемы, только выполняя одну операцию ввода-вывода за раз, в специальном потоке ввода-вывода, который получает работу из очереди FIFO. Это все равно не будет работать, если вы используете несколько объектов для ссылки на один и тот же базовый физический файл, но это устраняет необходимость блокировки, если остальная часть программы верна. Вы также должны быть осторожны (так же, как и без FIFO) об управлении порядком операций ввода-вывода в физическом файле. Если у вас есть поток, выполняющий чтение при смещении 0 и другой записи со смещением 0, какой файл ввода-вывода происходит первым? –
@Steve Я хочу сначала прочитать, а затем написать. Спасибо за ваши ценные комментарии. –