2009-05-06 12 views
3

J'ai un schéma de traitement d'événements qui devrait aussi éventuellement écrire dans un fichier; Je ne peux pas me permettre de retarder l'événement lorsque le fichier est vidé, c'est-à-dire en attente jusqu'à la fin de BufferedWriter.write (String).Différer BufferedWriter.write à un autre thread

Je cherche la meilleure façon d'y arriver (est, il y a une bibliothèque faire ça? Je pense que je ne suis pas le seul qui a eu ce problème)

Répondre

2

Fondamentalement, vous voulez que l'écriture à la fichier n'interrompez pas votre flux de gestion des événements.

Dans ce cas, tout ce que vous devez faire est de déléguer la gestion des fichiers à un thread séparé.

Votre code devrait ressembler à ceci:

// event handling starts 

Runnable fileHandlingThread = new Runnable() { 
    public void run() { 
     // open the file 
     // write to the file 
     // flush the file 
    } 
}; 

new Thread(fileHandlingThread).start(); 

// continue doing other things in the mean time 
+0

J'ai beaucoup d'événements à venir - parfois plus d'un quart de million par seconde. Je ne pense pas que créer un fil pour chaque événement serait efficace. – Dani

+0

Bien sûr, ce ne sera pas efficace. Utilisez un pool de threads. –

0

Vous pourriez faire un système de file d'attente, où vous mettez les événements sur une file d'attente/liste et un autre fil qui prend les événements à écrire, et écrivez-les. De cette façon, l'éditeur de fichiers sera asynchrone avec le reste du système, et votre seul retard sera d'ajouter un élément à une liste.

5

Vous pouvez utiliser un exécuteur à un seul thread pour effectuer l'écriture de fichier pour chaque événement.

ExecutorService executor = Executors.newSingleThreadExecutor(); 

// for each event 
executor.submit(new Runnable() { 
    public void run() 
    { 
    // write to the file here 
    } 
}); 

Il n'y aurait qu'un seul thread et l'exécuteur s'occuperait de la mise en file d'attente.

1

Tant que vous gardez le même fil, vous pouvez utiliser java.io.PipedOutputStream pour stocker les données et avoir une copie de fil séparée du fichier PipedInputStream correspondant au fichier.

Questions connexes