首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有一种更有效的方法来编写这段Jsoup代码

问有没有一种更有效的方法来编写这段Jsoup代码
EN

Stack Overflow用户
提问于 2016-04-24 14:42:09
回答 1查看 68关注 0票数 1

我正在用jsp做一个网站,用来比较不同购物网站的产品价格,我把代码写在一个jsp页面上,如下所示:

代码语言:javascript
复制
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(){}

此代码在同一页面上显示来自三个网站的单个搜索查询的结果。但问题是,我的网站现在加载速度很慢,有时一个或另一个网站的结果不显示。它给出了以下错误:

代码语言:javascript
复制
org.jsoup.HttpStatusException: HTTP error fetching URL.Status=500,URL=/*websitename*/
EN

回答 1

Stack Overflow用户

发布于 2016-04-24 19:34:27

最好使用多个线程来请求站点,这样您就可以同时向这些站点发送请求。

你可以通过java Task Executor Service这样做:

代码语言:javascript
复制
    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传递给它的构造函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36820099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档