Une partie de code multithread accède de façon asynchrone à une ressource (par exemple: un système de fichiers).Utilisation de variables de code et de condition multithread
Pour ce faire, j'utiliserai des variables de condition. Supposons que le FileSystem
est une interface comme:
class FileSystem {
// sends a read request to the fileSystem
read(String fileName) {
// ...
// upon completion, execute a callback
callback(returnCode, buffer);
}
}
J'ai maintenant une application qui accède au FileSystem
. Supposons que je puisse émettre plusieurs lectures via une méthode readFile()
. L'opération doit écrire des données dans le tampon d'octets qui lui est transmis.
// 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();
}
Est-ce la bonne façon d'utiliser les variables de condition? Est-ce que readFile()
reviendra immédiatement?
(Je sais qu'il ya un certain sillyness à l'aide de verrous pour les lectures, mais l'écriture dans un fichier est également une option.)