尝试多线程URL连接以减少加载时间

时间:2017-02-26 06:31:44

标签: java xml multithreading urlconnection

从主

剪断
    public void xmlQuery(String x,String y){

    //takes spaces off the input
    String k = x.trim();
    String v = y.trim();

    //calling the threading class
    for(int i = 0; i<18; i++){
        callThreading.threadedCall(i,k,v);
    }
}

线程类

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class callThreading {
public static void threadedCall(int th, String k, String v){
    switch(th){
        case 0:Thread currentThread0 = new Thread(threadedCall0(th, k, v)).start();
            break;
        case 1:Thread currentThread1 = new Thread(threadedCall1(th, k, v)).start();
            break;
        case 2:Thread currentThread2 = new Thread(threadedCall2(th, k, v)).start();
            break;
        case 3:Thread currentThread3 = new Thread(threadedCall3(th, k, v)).start();
            break;
        case 4:Thread currentThread4 = new Thread(threadedCall4(th, k, v)).start();
            break;
        case 5:Thread currentThread5 = new Thread(threadedCall5(th, k, v)).start();
            break;
        case 6:Thread currentThread6 = new Thread(threadedCall6(th, k, v)).start();
            break;
        case 7:Thread currentThread7 = new Thread(threadedCall7(th, k, v)).start();
            break;
        case 8:Thread currentThread8 = new Thread(threadedCall8(th, k, v)).start();
            break;
        case 9:Thread currentThread9 = new Thread(threadedCall9(th, k, v)).start();
            break;
        case 10:Thread currentThread10 = new Thread(threadedCall10(th, k, v)).start();
            break;
        case 11:Thread currentThread11 = new Thread(threadedCall11(th, k, v)).start();
            break;
        case 12:Thread currentThread12 = new Thread(threadedCall12(th, k, v)).start();
            break;
        case 13:Thread currentThread13 = new Thread(threadedCall13(th, k, v)).start();
            break;
        case 14:Thread currentThread14 = new Thread(threadedCall14(th, k, v)).start();
            break;
        case 15:Thread currentThread15 = new Thread(threadedCall15(th, k, v)).start();
            break;
        case 16:Thread currentThread16 = new Thread(threadedCall16(th, k, v)).start();
            break;
        case 17:Thread currentThread17 = new Thread(threadedCall17(th, k, v)).start();
            break;
    }
}

public static Runnable threadedCall0(int th, String k, String v){
    System.out.println("call0");
    return null;
}   
public static Runnable threadedCall1(int th, String k, String v){
    System.out.println("call1");
    return null;
}
}

...并且方法继续进行threadedCall17

编辑编辑以尽我所能反映MVCE。

我正在尝试同时多线程连接所有URL连接,以便减少程序的加载时间。当前加载时间约为11秒。 callThreading类中的参数int th从main方法中的for循环传递,int从0 ++传递到17.

有人指出,如果我要一次完成所有18个电话,那么回报会减少。一旦线程正常工作,我将修改不同的费率。

列出的代码导致“类型不匹配:无法从void转换为线程”错误。

如果我缺少任何细节,请告诉我。

2 个答案:

答案 0 :(得分:2)

第一条评论。您的threadCall方法很奇怪。每次调用它时,它会创建18个Thread对象,启动其中一个并抛弃其余对象。奇。但是,这不会导致线程瓶颈。 (未使用的线程永远不会开始......)

threadedCallNN方法中也有一些不良编码,但没有任何会导致线程瓶颈。

基本上,您向我们展示的代码中没有任何内容可以解释问题。

如果没有MCVE 我们可以自己运行,我们只能猜测为什么你没有加快速度。一些可能的解释:

  • 限制因素可能是端到端网络连接的吞吐量。

  • 限制因素可能是远程服务器提供数据的速率。

  • 远程服务器可能会对您进行速率限制;例如通过逐个处理您的请求。

如果真正的解释是其中任何一个,那么多线程将无济于事。

您可以通过添加一些跟踪来获得一些见解。例如,尝试查看线程是否实际上是在尝试同时读取数据,或者是否有某些事情导致它们一次执行一个线程。

答案 1 :(得分:2)

Thread currentThread1 = new Thread(...).start();

Thread.start()不会返回Thread。这是一种无效的方法。因此,您无法使用结果初始化任何内容。

你可以通过各种方式解决这个问题,但最简单的是:

Thread currentThread1 = new Thread(...);
currentThread1.start();

我真的不明白为什么你有这些Thread个变量。一个人会这样做。然后,您可以将start()调用移至switch语句之后:

Thread currentThread;
switch th)
{
case 0:
    currentThread = new Thread(...);
    break;
// ...
default:
    // unreachable, just to shut up the compiler
    return;
}
currentThread.start();