J'utilise client http apache pour exécuter certaines demandes de publication sur un serveur cible, en écrivant le contenu à l'aide de flux canalisés. Donc, fondamentalement, à partir d'un client http thread est à lire de PipedInputStream
et d'un autre thread, je suis en train d'écrire le contenu sur un PipedOutputStream
.Le thread Java PipedInputStream est dans l'état BLOQUÉ sans autre thread détenant le verrou?
De temps en temps, j'obtiens des bourrages de threads et je vois beaucoup de threads bloqués sur la méthode java.io.PipedInputStream.read()
exécutant la ligne wait(1000)
. L'état BLOCKED signifie que le thread de lecture attend pour récupérer le verrou après 1000 ms
écoulé. Mais ce que je ne comprends pas, c'est pourquoi je ne vois pas de fil d'écriture pour tenir le verrou dans le vidage du fil. Qu'est-ce qui me manque et comment puis-je éviter d'avoir des threads bloqués?
Voici quelques lignes de l'intérieur fichier de vidage de fil:
Thread 7912: (state = BLOCKED)
- java.lang.Object.wait(long) @bci=0 (Compiled frame; information may be imprecise)
- java.io.PipedInputStream.read() @bci=142, line=326 (Compiled frame)
- java.io.PipedInputStream.read(byte[], int, int) @bci=43, line=377 (Compiled frame)
- org.apache.http.entity.InputStreamEntity.writeTo(java.io.OutputStream) @bci=75, line=140 (Compiled frame)
- org.apache.http.impl.execchain.RequestEntityProxy.writeTo(java.io.OutputStream) @bci=10, line=123 (Compiled frame)
- org.apache.http.impl.DefaultBHttpClientConnection.sendRequestEntity(org.apache.http.HttpEntityEnclosingRequest) @bci=31, line=156 (Compiled frame)
- org.apache.http.impl.conn.CPoolProxy.sendRequestEntity(org.apache.http.HttpEntityEnclosingRequest) @bci=5, line=162 (Compiled frame)
- org.apache.http.protocol.HttpRequestExecutor.doSendRequest(org.apache.http.HttpRequest, org.apache.http.HttpClientConnection, org.apache.http.protocol.HttpContext) @bci=223, line=238 (Compiled frame)
- org.apache.http.protocol.HttpRequestExecutor.execute(org.apache.http.HttpRequest, org.apache.http.HttpClientConnection, org.apache.http.protocol.HttpContext) @bci=25, line=123 (Compiled frame)
- org.apache.http.impl.execchain.MainClientExec.execute(org.apache.http.conn.routing.HttpRoute, org.apache.http.client.methods.HttpRequestWrapper, org.apache.http.client.protocol.HttpClientContext, org.apache.http.client.methods.HttpExecutionAware) @bci=714, line=271 (Compiled frame)
- org.apache.http.impl.execchain.ProtocolExec.execute(org.apache.http.conn.routing.HttpRoute, org.apache.http.client.methods.HttpRequestWrapper, org.apache.http.client.protocol.HttpClientContext, org.apache.http.client.methods.HttpExecutionAware) @bci=447, line=184 (Compiled frame)
- org.apache.http.impl.execchain.RetryExec.execute(org.apache.http.conn.routing.HttpRoute, org.apache.http.client.methods.HttpRequestWrapper, org.apache.http.client.protocol.HttpClientContext, org.apache.http.client.methods.HttpExecutionAware) @bci=39, line=88 (Compiled frame)
- org.apache.http.impl.client.InternalHttpClient.doExecute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) @bci=168, line=184 (Compiled frame)
- org.apache.http.impl.client.CloseableHttpClient.execute(org.apache.http.client.methods.HttpUriRequest, org.apache.http.protocol.HttpContext) @bci=14, line=82 (Compiled frame)
- org.apache.http.impl.client.CloseableHttpClient.execute(org.apache.http.client.methods.HttpUriRequest) @bci=6, line=107 (Compiled frame)
S'il n'y a pas de données, le thread de lecture sera dans l'état 'RUNNABLE' ou' TIMED_WAITING' car il exécute la boucle while dans la méthode read ou exécute wait (long) depuis cette boucle. Être dans l'état BLOQUÉ signifie que l'autre thread a ce verrou, mais il n'y a pas un tel thread d'écriture dans le vidage du thread. –
Les flux de sortie n'obtiennent pas de données, et il ne s'agit pas de "lire et attendre pendant que inputStream aura des données". Avec quoi et les fautes d'orthographe, cette réponse est à peine compréhensible, et erronée lorsqu'elle est compréhensible. – EJP