I am using an CloseableHttpAsyncClient the following way: public class AsyncHttpClient {    private static final Logger logger = LogManager.getLogger(Main.class);    private static CloseableHttpAsyncClient HTTP_ASYNC_CLIENT = null;    private static HttpPost HTTP_POST = null;    private static HttpContext HTTP_CONTEXT;    private static PropertiesLoader PROP_LOADER = new PropertiesLoader();    private static Properties PROPERTIES = PROP_LOADER.initProp(./config/config.properties);    private static final int CON_REQUEST_TIMEOUT = Integer.valueOf(PROPERTIES.getProperty(connectionrequesttimeout));    private static final int CON_TIMEOUT = Integer.valueOf(PROPERTIES.getProperty(connecttimeout));    private static final int CON_SOCKET_TIMEOUT = Integer.valueOf(PROPERTIES.getProperty(sockettimeout));    private static final String CON_URL = PROPERTIES.getProperty(conurl);    private static final int CONMANAGER_MAX_TOTAL = Integer.valueOf(PROPERTIES.getProperty(conmanagermaxtotal));    private static final int DEFAULT_MAX_PER_ROUTE = Integer.valueOf(PROPERTIES.getProperty(conmanagermaxdefaultperroute));    //Reusable connection    private static RequestConfig createConnConfig() {        return RequestConfig.custom()                .setConnectionRequestTimeout(CON_REQUEST_TIMEOUT)                .setConnectTimeout(CON_TIMEOUT)                .setSocketTimeout(CON_SOCKET_TIMEOUT).build();    }    private static PoolingNHttpClientConnectionManager createPoolingConnManager() throws IOReactorException {        IOReactorConfig config = IOReactorConfig.DEFAULT;        ConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(config);        PoolingNHttpClientConnectionManager cm = new PoolingNHttpClientConnectionManager(ioReactor);        cm.setMaxTotal(CONMANAGER_MAX_TOTAL);        cm.setDefaultMaxPerRoute(DEFAULT_MAX_PER_ROUTE);        return cm;    }    private static synchronized CloseableHttpAsyncClient getCloseableClient() throws IOReactorException {        if (HTTP_ASYNC_CLIENT == null) {            logger.info(New Async Client created );            HTTP_ASYNC_CLIENT = HttpAsyncClientBuilder.create()                    .setDefaultRequestConfig(createConnConfig())                    .setConnectionManager(createPoolingConnManager()).build();            HTTP_ASYNC_CLIENT.start();        }        return HTTP_ASYNC_CLIENT;    }    private static synchronized HttpPost getPost() {        if (HTTP_POST == null) {            logger.info(New Post created );            HTTP_POST = new HttpPost(CON_URL);            HTTP_POST.setHeader(Accept, application/json);            HTTP_POST.setHeader(Content-type, application/json);        }        return HTTP_POST;    }    public static void postData(String data) throws Exception {        //TODO - needs cleanup        StringEntity entity = new StringEntity(data);        HttpPost httpPost = getPost();        httpPost.setEntity(entity);        getCloseableClient().execute(httpPost, HTTP_CONTEXT, new FutureCallback<HttpResponse>() {            @Override            public void completed(HttpResponse httpResponse) {                logger.info(Completed);            }            @Override            public void failed(Exception e) {                logger.info(Completed with exception  + e);            }            @Override            public void cancelled() {                logger.info(Cancelled );            }        });    }}Throughout the program I want only one instance to be alive, I am also using multiple threads to post data using the above class. 
Async HTTP client the right way
java;http