正在尝试多线程 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();
从主要部分截取
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();