Vấn đề về đồng bộ hóa trong java?
Chào mọi người, em đang làm bài tập về đồng bộ hóa trong java.
Đề bài yêu cầu: Viết chương trình tạo ra đối tượng đọc tập tin, viết tập tin chạy ở từng tiến trình
riêng (có xử lý đồng bộ hóa dư liệu).
Vậy ở đây phải tạo ra 2 class đọc và viết tập tin riêng đúng không ạ?
Và làm thế nào để trong một thời điểm chỉ có thể đọc hoặc ghi trên một file ạ?
ở đây em tạo 2 class như sau:
class FileTWrite để ghi tập tin:
// FileTWriter.java
package lab5;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
public class FileTWrite implements Runnable {
private String fileName;
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public FileTWrite(String fileName) {
this.fileName = fileName;
}
// Viết dãy số ngẫu nhiên vào file
@Override
public void run() {
try {
FileWriter fw = new FileWriter(new File(this.getFileName()));
BufferedWriter bw = new BufferedWriter(fw);
for(int i = 0 ; i < 100; i++){
int rand = (int) (Math.random() * 100);
bw.write(rand + " ");
}
bw.close();
fw.close();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Thread t1 = new Thread(new FileTWrite("test1.txt"));
Thread t2 = new Thread(new FileTWrite("test2.txt"));
Thread t3 = new Thread(new FileTWrite("test3.txt"));
t1.start();
t2.start();
t3.start();
System.out.println("Done!");
}
}
class FileTReader để đọc
// FileTReader.java
package lab5;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
public class FileTReader implements Runnable {
String fileName;
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public FileTReader(String fileName) {
this.fileName = fileName;
}
@Override
public void run() {
try {
FileReader fr = new FileReader(new File(this.getFileName()));
BufferedReader br = new BufferedReader(fr);
int c;
while((c = br.read()) != -1) {
System.out.println(this.getFileName() + ": " + c);
}
br.close();
fr.close();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Thread t1 = new Thread(new FileTReader("test1.txt"));
Thread t2 = new Thread(new FileTReader("test2.txt"));
Thread t3 = new Thread(new FileTReader("test3.txt"));
t1.start();
t2.start();
t3.start();
}
}
Giờ em tạo đối tượng ghi file test.txt trước, rồi đọc file test.txt đó bằng FileTReader nhưng lại ko ra kết quả ạ
class Test:
package test;
import lab5.FileTReader;
import lab5.FileTWrite;
public class Test {
public static void main(String[] args) {
FileTWrite ftw = new FileTWrite("test.txt");
Thread t1 = new Thread(ftw);
FileTReader fwr = new FileTReader("test.txt");
Thread t2 = new Thread(fwr);
t1.start();
t2.start();
}
}
Em đã thêm synchronized vào hàm run() của cả 2 class mà vẫn không được.
Ai giải thích cho em cái cơ chế đồng bộ này với ạ. Em cám ơn.
chưa ghi xong đã read thì làm gì có dữ liệu cho mà đọc. synchronized thif phải synchronized shared memory chứ, ở đây làm gì có đối tượng chung đâu mà synchronized
Bây giờ để đồng bộ quá trình đọc ghi trên cùng 1 file thì làm như thế nào ạ?
ghi xong rồi thì mới khởi động thread đọc thôi
Bây giờ để cho 2 thread đọc và ghi chạy đồng thời thì có được không ạ?
Theo yêu câu của đề bài này ạ: Viết
hàm main tạo ra đối tượng viết và đọc dữ liệu với tập tin giống nhau. Kiểm tra
việc đồng bộ hóa dữ liệu.