【问题标题】:Java timer that limits the amount of time a method can run for限制方法可以运行的时间量的 Java 计时器
【发布时间】:2020-06-14 06:09:13
【问题描述】:

我正在编写一个网络爬虫,部分规范是它将在用户指定的时间内爬取网络。为此,我尝试使用 Timer 和 TimerTask 方法。我现在拥有的代码是第二次尝试。我看过一些教程,尽管它们都不是我需要的。我也通读了文档。我已经在这个项目上工作了几个星期了,今晚就到期了。我不确定下一步该转向哪里。

    public void myTimer (String url, long time)
 {
    Timer webTimer = new Timer();
    TimerTask timer;
    timer = new TimerTask()
    {


        public void run()
        {
            long limit = calculateTimer(time);
            while(System.currentTimeMillis() < limit)
            {
                webcrawler crawler1 = new webcrawler();
                crawler1.Crawl(url);
            }
        System.out.println("times Up");
        }
    };
    webTimer.schedule(timer, 1000);

}

【问题讨论】:

  • 是否要在 URL 中间停止爬虫?你不能杀死一个线程(不再) - 这很危险。你可以interruptThread,但这可能有效也可能无效,并且可能会影响未经测试的代码路径。
  • 是的,我需要在用户指定的一段时间后停止网络爬虫,而不会杀死整个程序。它是项目规范的一部分。我希望我可以使用 Timer 和 TimerTask 方法,但上面的代码似乎没有运行。 print 语句永远不会打印出来。
  • 你可以在你的 http 客户端设置超时时间。
  • 我可能来不及做出贡献,但我想到的第一个解决方案(如果我正确理解您的问题)是使用ExecutorService 或类似的东西。它们为您提供了在给定时间过去后停止进程的必要选项。

标签: java


【解决方案1】:

我猜.Crawl() 正在启动一个循环并保持该线程忙碌,这意味着它无法检查 while 条件。我不知道您对爬虫的实现,但我会推荐一个函数stopCrawling,它将布尔值设置为 true 以打破该类内的循环。比我会做这样的事情:

public void startCrawler (String url, long time){

    webcrawler crawler1 = new webcrawler();
    crawler1.Crawl(url);

    TimerTask task = new TimerTask() {
        public void run() {
            crawler1.stopCrawling()
        }
    };
    Timer timer = new Timer("Timer");

    timer.schedule(task, time);


}

【讨论】:

  • 可以用线程实现停止爬虫的方法吗?如果是这样,你有任何线程教程吗?我阅读了有关线程的 java 文档,但它让我感到困惑
  • Timer 只有一个执行线程。但是ScheduledThreadPoolExecutor 可以配置任意数量的线程。您还可以查看详细示例herehere
  • 好的,所以我还是不明白如何将方法与线程相关联。如果我能弄清楚,我想我可以让任务中断那个线程。
  • 方法与线程无关。一般来说,任何线程都可以调用任何方法。此外,从另一个线程中断一个线程也不是一个好主意,而是使用标志/布尔值来控制行为。 while(running){doThreadStuff();} 然后从另一个线程执行running=false;。见this帖子
猜你喜欢
  • 2018-01-25
  • 2017-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 2011-06-15
相关资源
最近更新 更多