多线程httpClient [英] Multi-Threading httpClient

查看:143
本文介绍了多线程httpClient的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

public class test {
    public static final int nThreads = 2;

    public static void main(String[] args) throws ExecutionException, InterruptedException{
    //  Runnable myrunnable = new myRunnable();
        ExecutorService execute = Executors.newFixedThreadPool(nThreads);

        for (int i = 0; i < nThreads; ++i) {
            execute.execute(new MyTask());
        }           

        execute.awaitTermination(1000, TimeUnit.MILLISECONDS);

        execute.shutdown();
    }
}

class MyTask implements Runnable {
    public static final int maxCalls = 10;
    public static final int sleepMillis = 500;
    private static HttpResponse response;
    private static HttpClient httpclient;

    public void run(){
        int counter = 0;

        while (true) {

            if (counter >= maxCalls) {
                break;
            }
            try {
                Thread.currentThread().sleep(sleepMillis);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            execHttpRequest();

            ++counter;
        }
    }

    private void execHttpRequest() {
        httpclient = new DefaultHttpClient();
        HttpGet httpget = new HttpGet("My URL");

        try {

            response = httpclient.execute(httpget);
            BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
            String output;
            while((output=br.readLine())!=null){
                System.out.println(Thread.currentThread().getName() +output);
            }
            br.close();

            httpclient.getConnectionManager().shutdown();
            //httpclient.getConnectionManager().shutdown();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally{

            httpclient.getConnectionManager().shutdown();
        }

    }


}

运行此代码时,我得到以下异常:

While running this code, I get the following exception:

Exception in thread "pool-1-thread-1" java.lang.IllegalStateException: Invalid use of SingleClientConnManager: connection still allocated.
Make sure to release the connection before allocating another one.
    at org.apache.http.impl.conn.SingleClientConnManager.getConnection(SingleClientConnManager.java:216)
    at org.apache.http.impl.conn.SingleClientConnManager$1.getConnection(SingleClientConnManager.java:190)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:401)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732)
    at MyTask.execHttpRequest(test.java:72)
    at MyTask.run(test.java:60)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)
java.io.InterruptedIOException: Connection has been shut down
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:543)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732)
    at MyTask.execHttpRequest(test.java:72)
    at MyTask.run(test.java:60)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)
Caused by: org.apache.http.impl.conn.ConnectionShutdownException
    at org.apache.http.impl.conn.AbstractPooledConnAdapter.assertValid(AbstractPooledConnAdapter.java:86)
    at org.apache.http.impl.conn.AbstractPooledConnAdapter.getRoute(AbstractPooledConnAdapter.java:112)
    at org.apache.http.impl.client.DefaultRequestDirector.establishRoute(DefaultRequestDirector.java:740)
    at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:577)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:425)
    ... 8 more

当我执行http请求时,我会看到这些异常。它适用于单线程。我试图调用一个特定的URL(它工作得很好)但是当我向它添加多个线程时,它会抛出一个非法的状态异常。

When I execute http request, then I see these Exceptions. It works perfectly fine for single-threaded. I am trying to call a specific URL (which works perfectly fine) but when I add more than one thread to it, it throws an illegal state exception.

推荐答案

我意识到自己的愚蠢! httpClient和httpRequest都是静态的。在我使它们非静态之后它工作正常! Executor Service让我更好地控制线程管理,我热衷于使用它。

I realised my folly! httpClient and httpRequest were both static. After i made them non-static it works fine! Executor Service gives me better control on managing threads and I was keen on using it.

这篇关于多线程httpClient的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆