将递归函数与线程结合使用(Java)

时间:2016-02-07 14:02:46

标签: java multithreading recursion

阅读关于java并发对象的this教程和关于类似主题的this问题后,我不明白fork/join框架如何帮助递归方法。就我而言,我想在一个在线论坛上浏览一些部分及其主题:

 private void browseSection(Filter filter, WebClient webClient, String sectionUrl) {
        if(sectionUrl == null)
            return;
try {
            HtmlPage sectionPage = webClient.getPage(sectionUrl);
            // Get sections
            List<DomNode> sections = (List<DomNode>) sectionPage.getByXPath(forumTemplate.getXpathElements().get(forumTemplate.XPATH_GET_SECTIONS));
            if(sections == null)
                return;
            for (DomNode section : sections) {
                // Retrieve the url of the subsection
                String subsectionUrl = section.getNodeValue();
                // Go recursively in each subsection
                browseSection(filter, webClient, subsectionUrl);
            }
            // Get threads from section
            List<DomNode> threadsInSection = (List<DomNode>) sectionPage.getByXPath(forumTemplate.getXpathElements().get(forumTemplate.XPATH_GET_THREADS));
            // Browse threads
            for (DomNode threadInSection : threadsInSection) {
                browseThread(filter, webClient,
                        sectionUrl, threadInSection.getNodeValue());
            }
            // Go to the next section page
            DomNode nextPage = (DomNode) sectionPage.getFirstByXPath(forumTemplate.getXpathElements().get(forumTemplate.XPATH_GET_THREADS_NEXT_PAGE));

            String linkToNextSectionPage = nextPage.getNodeValue();

            // Browse the next page with threads from that section
            browseSection(filter, webClient, linkToNextSectionPage);
        } catch (Exception e) {

        }

    }

如何在更多线程之间分割浏览多个部分(重复调用browserSection())的工作?

如果在browseSection()方法中创建和启动了更多线程,则使用的线程数可能会呈指数级增长,因为嵌套部分更多。 fork/join可以提供工作线程数的上限吗?

1 个答案:

答案 0 :(得分:0)

在browseSection的每次调用中,您都使用不同的URL调用它。这可以在不同的线程上轻松处理。您可能不希望为每个调用创建一个新线程,但是您可以拥有一个可以独立并行地执行这些browseSection调用的执行程序池。