【问题标题】:Multi-threaded code and condition variable usage多线程代码和条件变量使用
【发布时间】:2010-11-17 01:59:35
【问题描述】:

一段多线程代码异步访问资源(例如:文件系统)。

为了实现这一点,我将使用条件变量。假设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() 会立即返回吗?

(我知道使用锁进行读取有些愚蠢,但写入文件也是一种选择。)

【问题讨论】:

    标签: java multithreading asynchronous monitor condition-variable


    【解决方案1】:

    您的问题有很多遗漏(即没有具体提及线程),但无论如何我都会尝试回答。

    锁和条件变量都没有给你后台功能——它们只是用于一个线程等待来自其他线程的信号。尽管您没有提及,disk.read(file) 方法可以生成一个线程来执行 IO,然后立即返回,但调用者无论如何都会坐在readReady 循环中,这似乎毫无意义。如果调用者必须等待,那么它可以自己执行 IO。

    更好的模式可能是使用 Java 5 Executors 服务之类的东西:

     ExecutorService pool = Executors.newFixedThreadPool(int numThreads);
    

    然后您可以调用pool.submit(Callable),它将提交要在另一个线程中在后台执行的作业(当池下一个可用时)。提交返回一个Future,调用者可以使用它来调查后台任务是否已完成。它也可以返回一个结果对象。并发类会为您处理锁定和条件信号/等待逻辑。

    希望这会有所帮助。

    附言此外,您应该使 readReady 不稳定,因为它没有同步。

    【讨论】:

      猜你喜欢
      • 2018-10-08
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多