执行程序如何在java中终止递归? [英] How is an executor termination recursion in java?
问题描述
这是一个程序,它读取以前格式的信息站点,它使用递归和执行器。工作正常,我的问题是测试程序是否完成和成功通知。
This is a program that reads information site for previous format it uses recursion and executor.It works fine,my problem is to test whether the program is completed and success notification.
public class NewClass {
static String levels[] = { "div.col-md-9 li a", "div#sidebar ul li a" };
static String links = "";
private void getRecursive(String href, int level, final ExecutorService executor) {
if (level > levels.length - 1) {
return;
}
Document doc;
try {
doc = Jsoup.connect(href).get();
Elements elements = doc.select(levels[level]);
final int flevel = ++level;
for (final Element element : elements) {
executor.execute(new Runnable() {
@Override
public void run() {
if (!element.attr("href").isEmpty()) {
links += element.attr("abs:href") + "\n";
System.out.println(links);
getRecursive(element.attr("abs:href"), flevel, executor);
}
}
});
}
} catch (IOException e1) {
e1.printStackTrace();
}
}
如果 levels.length = 1 ,规则执行器运行良好,但如果 levels.length> 1 将出现错误:线程pool-1-thread-138中的异常java.util.concurrent.RejectedExecutionException
If levels.length = 1, the rule enforcer works well,but If levels.length>1 will appear error : Exception in thread "pool-1-thread-138" java.util.concurrent.RejectedExecutionException
public static void main(String[] args) {
try {
ExecutorService executor = Executors.newFixedThreadPool(5);
new NewClass().getRecursive("http://www.java2s.com/", 0, executor);
executor.shutdown();
executor.awaitTermination(1, TimeUnit.HOURS);
if (executor.isTerminated()) {
JOptionPane.showMessageDialog(null, "Success");
}
} catch (Exception ex) {
Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
推荐答案
关闭 ExecutorService
后,您无法提交任何新任务,在您处理完所有级别后,递归似乎停止了(您不提交之后的任何新任务,你可以这样做:
You can't submit any new tasks after you shutdown the ExecutorService
, the recursion seems to stop after you've processed all the levels (you don't submit any new tasks after that), you can do something like this:
if (level > levels.length - 1) {
executor.shutdown();
return;
}
这篇关于执行程序如何在java中终止递归?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!