未在方法

时间:2016-08-28 00:40:58

标签: java multithreading

我正在尝试通过构建网络爬虫来学习线程,在以下代码中 searchHelper(网站,关键字);从网页中查找所有链接并保留在网址中包含关键字的链接,其想法是调用searchHelper,然后为每个链接找到一个线程,以便充当网络抓取工具,例如,如果FIRST网站它上面包含5个链接,然后将形成5个线程,这样就会有五个网络爬虫一起工作,目前线程不工作,所以我只能从第一页获得结果,我已经能够让它无需工作线程,例如,如果我删除整个for循环并用while循环替换然后web爬虫程序按预期工作,任何帮助都会欣赏,这里是执行线程的方法

    private void search(String website, String keyword) 
{
    searchHelper(website, keyword);
    int limit = queue.size();
    Thread[] threads = new Thread[limit];
    for(int i = 0; i < limit; i++)
    {
        threads[i] = new Thread(new Runnable() 
        {
            @Override
            public void run()
            {
                while(!queue.isEmpty() && queue.size() <= 10000)
                    searchHelper(queue.poll(), keyword);
            }
        });  
        threads[i].start();
    }

    if(results.isEmpty())
        text.append("No results, sorry :(");
    else
    {
        text.append("\nList of results:\n\n");
        for(String x: results)
            text.append(x + "\n");      
    }
}

2 个答案:

答案 0 :(得分:0)

您不必等待线程完成。甚至在单个线程完成其工作之前,可能会到达代码的最后一部分,因此无法显示任何结果。

答案 1 :(得分:0)

在你的for循环之后添加这个:

for(int i = 0; i < limit; i++)
{
    threads[i].join();
}

这样,主线程将在访问结果之前等待所有线程完成执行。