Although Jersey
 already have support for making asynchronous requests, it is 
implemented by standard blocking way - every asynchronous request is 
handled by one thread and that thread is released only after request is 
completely processed. That is OK for lots of cases, but imagine how that
 will work when you need to do lots of parallel requests. Of course you 
can limit (and its really wise thing to do, you do want control your 
resources) number of threads used for asynchronous requests, but you'll 
get another maybe not pleasant consequence - obviously processing time 
will incerase.
  There are few projects which are trying to deal 
with that problem, commonly named as async http clients. I didn't want 
to "re-implement a wheel" and I decided I'll use AHC - Async Http 
Client made by Jeanfrancois Arcand. There is also interesting implementation from Apache - HttpAsyncClient, but it is still in "very early stages of development" and others haven't been in similar or better shape as AHC.
  How
 this works? Non-blocking clients allow users to make same asynchronous 
requests as we can do with standard approach but implementation is 
different - threads are better utilized, they don't spend most of time 
in idle state. Simply described - when you make a request (send it over 
the network), you are waiting for reply from other side. And there comes
 main advantage of non-blocking approach - it uses these threads for 
further work, like making other requests or processing responses etc.. 
Idle time is minimized and your resources (threads) will be far better 
used.
  Who should consider using this? Everyone 
who is making lots of asynchronous requests. I haven't done proper 
benchmark yet, but some simple dumb tests are showing huge improvement 
in cases where lots of concurrent asynchronous requests are made in 
short period.
  Last but not least - this module is still 
experimental, so if you don't like something or if you have ideas for 
improvements/any feedback, feel free to comment this blog post, send 
mail to 
[email protected] or contact me personally. All feedback is greatly appreciated!
  maven dependency (will be present in java.net maven 2 repo by the end of the day):
  link: http://download.java.net/maven/2/com/sun/jersey/experimental/jersey-non-blocking-client
  <dependency>
 <groupId>com.sun.jersey.experimental</groupId>
 <artifactId>jersey-non-blocking-client</artifactId>
 <version>1.9-SNAPSHOT</version>
</dependency>
  code snippet:
   ClientConfig cc = new DefaultNonBlockingClientConfig();
 cc.getProperties().put(NonBlockingClientConfig.PROPERTY_THREADPOOL_SIZE, 10); // default value, feel free to change
 
Client c = NonBlockingClient.create(cc);
 AsyncWebResource awr = c.asyncResource("http://oracle.com");
 Future<ClientResponse> responseFuture = awr.get(ClientResponse.class);
 // or
 awr.get(new TypeListener<ClientResponse>(ClientResponse.class) {
     @Override
     public void onComplete(Future<ClientResponse> f) throws InterruptedException {
          ...
     }
 });
  javadoc (temporary location, won't be updated): http://anise.cz/~paja/jersey-non-blocking-client/