阅读关于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
可以提供工作线程数的上限吗?
答案 0 :(得分:0)
在browseSection的每次调用中,您都使用不同的URL调用它。这可以在不同的线程上轻松处理。您可能不希望为每个调用创建一个新线程,但是您可以拥有一个可以独立并行地执行这些browseSection调用的执行程序池。