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

Attempting to Multithread URL Connections to Reduce Load Time

从主要部分截取

    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);
    }
}

穿线class

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 class 中的参数 int th 是从 main 方法中的 for 循环传递的,int th 从 0++ 到 17。

有人向我指出,如果我一次完成所有 18 个调用,return 会减少。一旦线程开始工作,我将修改不同的速率。

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

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

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

threadedCallNN 方法中也有一些糟糕的编码,但不会导致线程瓶颈。

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

在没有 MCVE 我们可以 运行 自己 的情况下,我们只能猜测为什么你没有得到加速。几个可能的解释:

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

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

  • 远程服务器可能限制了您的速率;例如一次处理一个请求。

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

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

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

Thread.start() 不是 return 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();