我正在用jsp做一个网站,用来比较不同购物网站的产品价格,我把代码写在一个jsp页面上,如下所示:
try
{
jsoup.connect(first_website)
/* code for fetching prices and images */
/* Html code for displaying prices and images */
} catch(){}
try
{
jsoup.connect(second_website)
/* code for fetching prices and images */
/* Html code for displaying prices and images */
} catch(){}
try
{
jsoup.connect(third_website)
/* code for fetching prices and images */
/* Html code for displaying prices and images */
} catch(){}此代码在同一页面上显示来自三个网站的单个搜索查询的结果。但问题是,我的网站现在加载速度很慢,有时一个或另一个网站的结果不显示。它给出了以下错误:
org.jsoup.HttpStatusException: HTTP error fetching URL.Status=500,URL=/*websitename*/发布于 2016-04-24 19:34:27
最好使用多个线程来请求站点,这样您就可以同时向这些站点发送请求。
你可以通过java Task Executor Service这样做:
FutureTask<Boolean> futureTask1 = new FutureTask<Boolean>(new Callable<Boolean>()
{
@Override
public Boolean call() throws Exception
{
try
{
//jsoup.connect(second_website)
/* code for fetching prices and images */
/* Html code for displaying prices and images */
return true;
} catch(Exception e){
return false;
}
}
});
FutureTask<Boolean> futureTask2 = new FutureTask<Boolean>(new Callable<Boolean>()
{
@Override
public Boolean call() throws Exception
{
//Same as above
}
});
FutureTask<Boolean> futureTask3 = new FutureTask<Boolean>(new Callable<Boolean>()
{
@Override
public Boolean call() throws Exception
{
//Same as above
}
});
ExecutorService executorService = Executors.newFixedThreadPool(3);
executorService.execute(futureTask1);
executorService.execute(futureTask2);
executorService.execute(futureTask3);
while (true){
if(futureTask1.isDone() && futureTask2.isDone() && futureTask3.isDone()){
//Here work is done
try
{
if(futureTask1.get()){
//task 1 done it's work correctly
}else {
//some problem in task
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
try
{
Thread.sleep(100);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}如果您在这些任务之间有共同的逻辑,您可以创建一个实现Callable接口的类,并将站点url传递给它的构造函数。
https://stackoverflow.com/questions/36820099
复制相似问题