[英]Multi-threaded code and condition variable usage
多線程代碼段異步訪問資源(例如:文件系統)。
為此,我將使用條件變量。 假設FileSystem
就像是一個界面:
class FileSystem {
// sends a read request to the fileSystem
read(String fileName) {
// ...
// upon completion, execute a callback
callback(returnCode, buffer);
}
}
我現在有一個訪問FileSystem
的應用程序。 假設我可以通過readFile()
方法發出多次讀取。 該操作應將數據寫入傳遞給它的字節緩沖區。
// constructor
public Test() {
FileSystem disk = ...
boolean readReady = ...
Lock lock = ...
Condition responseReady = lock.newCondition();
}
// the read file method in quesiton
public void readFile(String file) {
try {
lock.lock(); // lets imagine this operation needs a lock
// this operation may take a while to complete;
// but the method should return immediately
disk.read(file);
while (!readReady) { // <<< THIS
responseReady.awaitUninterruptibly();
}
}
finally {
lock.unlock();
}
}
public void callback(int returnCode, byte[] buffer) {
// other code snipped...
readReady = true; // <<< AND THIS
responseReady.signal();
}
這是使用條件變量的正確方法嗎? readFile()
立即返回?
(我知道使用鎖進行讀取有些愚蠢,但是寫入文件也是一種選擇。)
您的問題有很多遺漏(即沒有具體提及線程),但是無論如何我都會嘗試回答。
鎖和條件變量都沒有為您提供后台功能-它們僅用於線程等待來自其他線程的信號。 盡管您沒有提到它, disk.read(file)
方法可能會產生一個線程來執行IO,然后立即返回,但調用者無論如何都將處於readReady
循環中,這似乎毫無意義。 如果調用方必須等待,則它可以自行執行IO。
更好的模式可能是使用類似Java 5 Executors服務的東西:
ExecutorService pool = Executors.newFixedThreadPool(int numThreads);
然后,您可以調用pool.submit(Callable)
,它將在另一個線程中提交要在后台執行的作業(當下一個池可用時)。 提交返回一個Future
,調用者可以使用該Future
來調查后台任務是否已完成。 它也可以返回結果對象。 並發類為您處理鎖定和條件信號/等待邏輯。
希望這可以幫助。
ps另外,由於未同步readReady
,因此應使其readReady
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.