java - java中的执行程序终止递归如何?

标签 java recursion executorservice executor termination

这是一个程序,它使用递归和执行器读取以前格式的信息站点。它工作正常,我的问题是测试程序是否完成和成功通知。

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

    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 后您无法提交任何新任务,递归似乎在您处理完所有级别后停止(之后您不会提交任何新任务),你可以这样做:

if (level > levels.length - 1) {    
    executor.shutdown();
    return; 
}   

关于java - java中的执行程序终止递归如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33512762/

相关文章:

java - 如何使用 ScheduledExecutorService 通过多个服务定期运行作业

java - Dijkstra 或 A* 在 10x10 网格上,障碍物是随机的,起点在 0,0,终点在 9,9?

python - 将递归算法转换为迭代算法

java - 基于图 block 的游戏中的碰撞检测仅适用于数组中的文件图 block

javascript - 如何递归调用promise函数

java - 如何在没有任何 for 循环的情况下递归地解压缩字符串?

grails - Grails-在Bootstrap.groovy中调用runAsync

java - JPA 中打开的最大游标

java - 替换字符串中的数字

java - 如何将微调器与我的转换器连接