Simultanément en lecture/écriture de canal nommé en Java (sur windows)

Je suis en train d'assurer la communication entre une application en C# et Java application sur windows à l'aide de canaux nommés avec la méthode décrite par v01ver dans cette question: Comment ouvrir un pipe nommé Windows à partir de Java?

Je suis confronté à un problème sur le Java côté parce que j'ai un thread de lecture constamment en attente pour l'entrée sur le tuyau et quand j'essaye d'écrire pour le tuyau de mon thread principal, il se coince toujours.

final RandomAccessFile pipe;
try {
   pipe = new RandomAccessFile("\\\\.\\pipe\\mypipe", "rw");
}
catch (FileNotFoundException ex) {
   ex.printStackTrace();
   return;
}

Thread readerThread = new Thread(new Runnable() {
   @Override
   public void run() {
      String line = null;
      try {
         while (null != (line = pipe.readLine())) {
            System.out.println(line);
         }
      }
      catch (IOException ex) {
         ex.printStackTrace();
      }
   }
});
readerThread.start();

try { Thread.sleep(500); } catch (InterruptedException e) {}

try {
   System.out.println("Writing a message...");
   pipe.write("Hello there.\n".getBytes());
   System.out.println("Finished.");
}
catch (IOException ex) {
   ex.printStackTrace();
}

La sortie est:

la Rédaction d'un message...

et puis il attend toujours.

Comment puis-je écrire à un canal nommé lors de l'attente pour l'entrée dans un autre thread?

...et vous ne pouvez pas éteindre et de ne pas éteindre la lecture? lecture seule si le fichier n'est pas à la fin, sinon bloquer sur poll un blocage de la file d'attente à attendre pour les écritures; et, finalement, l'utilisation d'un thread unique. si vous êtes intéressé je peux vous en montrer un extrait; cependant je n'ai pas de xp w/ named pipes comme ça et une simple prise est 10 fois plus facile à gérer
Il pourrait être utile d'utiliser JVisualVM pour voir si vous thread(s) sont bloqués à l'O/S ou la Java de la synchronisation de l'acquisition.
Plutôt que d'utiliser un tube nommé, vous pouvez le trouver à l'aide de sockets est plus évolutif (canaux sont mis en œuvre à l'aide de sockets sous Windows en tout cas), Vous trouverez plus d'exemples de comment les utiliser (comme ils le faisaient le plus souvent) qui devrait vous aider.
Lawrey: les canaux Nommés dans les Fenêtres ne sont PAS mises en œuvre à l'aide de sockets. Lorsque le client et le serveur sont sur la même machine, ils utilisent la mémoire partagée pour l'IPC et sont extrêmement rapides.
Les pipes de Java (nio) sont mis en œuvre via des sockets sur Windows et OS des tuyaux sur Linux. Native de Windows canaux nommés ne sont pas prises et leur impl. ne dépend pas de winsock. C'est juste de java qui ne les utilise pas car il n'est pas possible d'enregistrer le même sélecteur pour les sockets et windows tuyaux.

OriginalL'auteur takteek | 2011-02-11