Tôi có một số chủ đề (một số trong số đó được sinh ra bởi Quy trình X, một số khác bằng Process Y, et cetera) và mỗi chuỗi cần phải ghi vào một tệp MyFile
. Tuy nhiên, nếu Thread T1
bắt đầu viết thành MyFile
trước tiên, khi Thread T2
bắt đầu viết, cần phải chờ T1
để phát hành tệp để có thể đọc nội dung được viết trong Thread T1
. Nói cách khác, mỗi chủ đề sẽ có một phương pháp finalizeThread
, như vậy:Khóa tệp Java
private void finalizeThread() {
File f = new File("MyFile.dat");
f.createNewFile(); // atomically creates the file, if it doesn't exist
locked_section {
readContentsFromFile(f); // read contents if some other thread already modified the file
modifyContentsFromFile(f); // modify
writeFile(f); // write, so that new threads can see the content modified by this thread
}
}
Câu hỏi của tôi là: Làm thế nào tôi có thể thực hiện các locked_section
trong đoạn code trên? Tôi đã nhìn vào lớp FileLock
, nhưng nó nói trong Javadoc rằng "Khóa tệp được tổ chức thay mặt cho toàn bộ máy ảo Java. Chúng không thích hợp để kiểm soát quyền truy cập vào tệp theo nhiều luồng trong cùng một máy ảo.".
bạn có chắc chắn rằng bạn thực sự muốn phương thức finalize() không? – Dmitry
Không, tên của phương thức không thực sự là 'finalize'. Đó là một phương thức/gọi lại được gọi sau chuỗi (thực ra, một tập hợp các luồng, nhưng điều này không liên quan đến trường hợp) được hoàn thành với công việc của nó, vì tôi không sử dụng các luồng API Java Concurrency chuẩn. Tôi sẽ đổi tên nó để tránh nhầm lẫn với 'Object # finalize'. –