2017-06-08 56 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 
     } 
    } 
}); 

注意,在上面放实行()是一个阻塞操作,这意味着如果队列已满,等到再有足够的空间来插入任务。