2017-06-08 12 views
-1

私はAsyncHttpClientを使用していて、多くのhttp要求を並行して行っています。私は次のエラーを取得しています :スレッド制限を超えてブロックされたワーカーを交換する

java.util.concurrent.RejectedExecutionException: Thread limit exceeded replacing blocked worker 

は、どのように私は自由のスレッドがあるまで新しい要求が待機動作を行うことができますか?

マイコード:

public class MyClass { 
    private AsyncHttpClient asyncHttpClient = new DefaultAsyncHttpClient(); 

    public JSONObject jsonFromUrl(String requestUrl) { 
     CompletableFuture<Response> futureResponse = asyncHttpClient.prepareGet(requestUrl). 
       addHeader("header-name", "header-value").execute().toCompletableFuture(); 
     try { 
      Response response = futureResponse.get(); 
      ... handling response 
     } catch (Exception e) { 
      ... handling exception 
     } 
    } 
} 

答えて

1

あなたはエグゼキュータの作業キューに追加することによって拒否されたタスクを処理するスレッドプールのためのRejectedExecutionHandlerを実装して設定することができます。キューがいっぱいの場合は部屋がタスクを挿入するために、再びそこになるまでプット上記の実装では()を意味し、ブロッキング操作であること

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/RejectedExecutionHandler.html

threadPoolExecutor.setRejectedExecutionHandler(new RejectedExecutionHandler() { 
    @Override 
    public void rejectedExecution(Runnable task, ThreadPoolExecutor executor) { 
     try { 
      executor.getQueue().put(task); 
     } catch (InterruptedException e) { 
      // handle exception 
     } 
    } 
}); 

注待機します。

関連する問題