簡體   English   中英

多線程代碼和條件變量的用法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM