当前位置: 首页 > 面试题库 >

Java中的执行者终止递归如何?

章学义
2023-03-14
问题内容

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

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; 
}


 类似资料:
  • 我试图写一个程序,找出给定的数字是否在斐波那契序列中,我不断得到不终止的递归,我不知道为什么。第17行似乎是个大问题。当我输入0或1时,我会得到想要的答案。我只是在寻找答案,我正在努力学习,所以仅仅告诉我答案对我没有多大帮助。

  • 在我的progress函数中,它将到达递归的底部,但是我期望返回的值没有改变。 这应该返回true,它符合条件(记录文本),但随后继续移动,并且始终返回false。

  • 我正在尝试使用JavaDOM解析器为XML文档中的许多标记建立索引,以从中形成类似MIB的结构(例如 我希望将模块映射到1,将容器映射到1.1,将列表映射到1.1.1,将叶映射到1.1.1.1,将另一个叶映射到1.1.1.2(我已经有了这样做的方法),但在嵌套相同命名的XML标记时,我遇到了问题。以下是我创建的函数——为了简单起见,只需打印属性名 下面是我试图解析的XML示例: 当我在这个程序上运

  • 问题内容: 假设您有表格和。保存演示文稿并包含基本事件信息(如位置和日期)后,将使用触发器自动创建事件。(由于技术原因,恐怕不可能仅将数据保存在一个位置并使用视图。)此外,在稍后的演示中更改此信息时,触发器也会将更新复制到事件中,像这样: 现在,客户需要它,这样,如果用户更改了 事件中 的信息,它也应该返回到演示。出于明显的原因,我不能相反: 毕竟,这将导致每个触发器彼此触发。我可以做的是在两个表

  • 问题内容: 在这个sqlfiddle中… http://sqlfiddle.com/#!6/b6587/6 我收到以下错误…。 声明终止。在语句完成之前,最大递归100已用尽。 我知道CTE第二选择的where子句中需要进行“终止检查”。即使您取消注释WHERE子句,我也会遇到相同的错误。 我只是想了解1)为什么根本需要它……毕竟每个订单行都与每个客户行都有关系,2)由于需要“终止检查”,因此该示

  • 问题内容: 我得到一张下表: 如果用户搜索“ 1”,则程序将查看具有“ 1”的,然后它将在“ 5”中得到一个值,然后程序将继续在其中搜索“ 5”,并且将得到“ 3”在中,依此类推。因此它将打印出: 如果用户搜索“ 6”,它将打印出: 如何建立一个查询来做到这一点? 问题答案: 编辑 @leftclickben提到的解决方案也是有效的。我们也可以对它使用存储过程。 我们使用临时表存储输出结果,并且由