J'ai besoin d'avoir un flux de char code> tampon code> dans lequel j'écris dans un fil et à partir de laquelle j'ai lu un autre fil. en ce moment J'utilise PipeDreader et Voipewriter pour cela , mais ces classes provoquent un problème de performance: PIPEDREADER fait un Y aurait-il une bibliothèque qui fait la même chose que Pipedreader / PipedWriter, mais avec de meilleures performances? Ou devrai-je mettre en œuvre mes propres roues? P> attendre (1000) code> lorsque son tampon interne est vide, ce qui provoque une traînée de mon application visiblement. P>
4 Réponses :
Il devrait être assez facile d'envelopper une API de flux de charme autour de blockingQueue code> . p>
Je dois dire, cependant, il semble assez pervers que pipedrader code> utiliserait des interrogations pour attendre les données. Est-ce documenté quelque part ou l'avez-vous découvert pour vous-même en quelque sorte? P>
Je pense que vous vouliez dire sur " Java. Sun.com/javase/6/docs/api/java/util/concurrent/... "
Oui, c'est mon plan B, si je ne trouve pas de classe qui fait déjà ce dont j'ai besoin.
Merci Phil. J'étais trop rapide sur le tirage au sort avec ma recherche Google. :-)
En effet c'est assez pervers. J'ai découvert le décalage dans mes tests, profilé la cause d'être dans PipedReader et j'ai trouvé la raison d'être l'attente du code d'attente (1000) d'appels à
Juste pour clarifier aux lecteurs: attendre (1000) code> n'est pas comme SLEEP (1000) code> - il tombe immédiatement lorsqu'il est notifier code> ed ces données est disponible. Le délai d'attente est de gérer les situations d'erreur - si le fil source de données meurt de manière inattendue et ne peut plus en informer, en particulier.
J'ai mis en place quelque chose d'un peu similaire, et a posé une question si quelqu'un d'autre avait mieux Code pensé et testé. P>
@esko Luontola, j'ai lu votre code dans le paquet SBT pour essayer de comprendre ce que vous faites. Il semble que vous souhaitiez démarrer un processus J'essaierais de modifier la boucle principale dans Je ne sais pas comment exécuter votre code pour que je ne puisse pas entrer de plus en plus profondément. J'espère que cela aide. P> processus code> et transmettre l'apport à celui-ci et que le résultat de l'action soit tied à différents endroits. Est-ce que c'est du tout correct? P>
ReaderAtowriTercoPicier code> de sorte que, au lieu de faire un lue () code> - une opération de blocage qui apparemment lorsqu'un Pipedreader code > Est impliqué des causes de vote - vous attendez explicitement le écrivain code> sur affleurant code>. La documentation est claire que flush code> entraîne un lecteur code> s à notifier. P>
Mon cas d'utilisation est qu'il existe plusieurs lecteurs pour quel processus Processus code>, et chacun de ces lecteurs a besoin de sa propre copie du flux, à partir du moment actuel et se terminant lorsque le lecteur est fermé. Différents lecteurs pour ne pas s'affronter mutuellement. Celui qui lisant la pipedreader est par exemple de sortieReader.waitforoutput () code>. L'écrivain est ReaderowriterCopier Code>. Le programme principal est sbtrunner code> et les sources de test ont sbtrunnerter code> qui l'utilise. SBT représente code.google.com/p/simple-build-tool
Le problème était que lorsque quelque chose est écrit sur le PipedWriter, il n'indique pas automatiquement la PIPEDREADER qu'il existe des données à lire. Lorsque l'on essaie de lire PipeDreader et que le tampon est vide, la pipedreader boucle et attendre à l'aide d'un appel La solution consiste à appeler (Pour moi, la mise en œuvre de PipedReader / PipedWriter ressemble beaucoup à un cas d'optimisation prématurée - pourquoi ne pas notifier à chaque écriture? Les lecteurs attendent également dans une boucle active, se réveillant chaque seconde, au lieu de se réveiller que lorsqu'il y a Quelque chose à lire. Le code contient également des commentaires de TODO, que la détection de filetage de lecteur / écrivain qui ne soit pas assez sophistiquée.) P>
Ce même problème semble également être également dans PipedOutPutStream < / a>. Dans mon projet actuel appelant wait (1000) code> appeler jusqu'à ce que le tampon ait des données. P>
pipedwriter.flush () code> toujours après avoir écrit quelque chose sur le tuyau. Tout ce que le flush est appelé notifier () code> sur le lecteur. La solution au code en question ressemble à ce . P>
flush () code> manuellement n'est pas possible (ne peut pas modifier les communes IO's ioutils.copy () ), donc je l'ai résolu en créant emballages de latence pour les classes de tuyaux. Ils travaillent beaucoup mieux que les cours d'origine. : -) p>
Cela peut ne pas être ce que vous voulez, mais votre fil d'écriture serait-il capable de notifier le fil de lecture après avoir écrit quelque chose? Et le fil de lecture continuera à lire tandis que
prêt () code> est vrai, puis dormez quand ce n'est pas?Pourriez-vous nous montrer votre code, s'il vous plaît? Le
attendre (1000) code> ne devrait pas être le problème, car l'écrivain notifie le lecteur lorsque quelque chose est écrit. Le lecteur s'échappe alors de son attente ().Merci, Phil. Je ne suis pas maintenant à la maison, je ne peux donc pas le tester, mais sur la base du code source Pipedwriter.flush () semble informer les lecteurs. Je vais essayer plus tard aujourd'hui.