【问题标题】:Kill threads created by an object杀死对象创建的线程
【发布时间】:2013-02-01 10:48:14
【问题描述】:

我使用 crawler4j 创建了一个自定义爬虫。在我的应用程序中,我创建了很多控制器,一段时间后,系统中的线程数将达到最大值,JVM 将抛出异常。即使我在控制器上调用ShutDown(),并将其设置为null 并调用System.gc(),我的应用程序中的线程仍保持打开状态,应用程序将崩溃。

我使用了jvisualvm.exe (Java VisualVM),发现我的应用程序在某一时刻遇到了 931 个线程。

有没有办法可以立即杀死由 crawler4j 项目的 CrawlController 对象创建的所有线程? (或与此相关的任何其他对象)

【问题讨论】:

  • 你可以控制线程的 run() 方法吗?你能告诉我们吗?听起来线程不会死。
  • 我使用的是 crawler4j 类的 .jar 文件。但是,如果我找不到一个简单的方法来做到这一点,我可以访问 crawler4j 的源代码。我想停止 crawler4j 的控制器线程。
  • 来自 crawler4j 的主页 >您还应该实现一个控制器类,它指定爬取的种子、中间爬取数据应该存储的文件夹和并发线程数:
  • 我正在这样做,但我想创建一个可以关闭由 crawler4j 创建的线程的控制器
  • 我只是看了一下代码......每个爬虫控制器似乎都有一个MonitorThread......乍一看没有看到如何实现。

标签: java multithreading web-crawler crawler4j


【解决方案1】:

我刚刚花了 2 个小时来解决完全相同的问题。我终于找到了错误的来源。如果创建一个控制器,但不启动它,shutdown() 不会杀死任何创建的线程。相反,您必须使用以下内容:

controller.shutdown();
controller.getPageFetcher().shutdown();

controller 是您的 CrawlController 实例。
我也在 crawler4j 项目页面上提出了这个问题,看起来这个问题将在 3.6 版本中得到修复

【讨论】:

  • 我现在没有代码来测试它是否适合我,但似乎它会起作用。尽管如此,我将把它标记为答案。感谢您分享您的解决方案。
【解决方案2】:

以法莲是正确的。 Crawler4j 有两个问题:

  1. 未在 CrawlController 中关闭 Environment 对象。
  2. 未关闭 CrawlController 中的 PageFetcher 对象。

https://code.google.com/r/yonid-crawler4j/

我已经尽力创建一个启动后正确关闭的版本(startunblocking) 以及在您创建控制器但不运行启动功能的情况下使用 forceShutdown。

【讨论】:

    【解决方案3】:

    ShutDown() 好心地要求线程完成他们的工作,然后会击落,但是如果线程有无穷无尽的任务,他们永远不会完成呢?您是否尝试过使用shutdownNow()?这将在完成之前中断正在运行的任务并立即关闭线程。

    【讨论】:

    • 我找不到那个功能。它属于哪个类?谢谢
    • 我正在使用Executors.newScheduledThreadPool(int) 方法在接口ExecutorService 这是Java API 的一部分而不是 crawler4j
    • 我如何使用它?可以用示例代码演示一下吗?
    • 我认为这行不通,因为我在不同的情况下使用它并且 CrawlController 没有扩展 ExecutorService,对不起我的错误。
    • 哦,很遗憾听到这个消息。没问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 2021-11-13
    • 1970-01-01
    相关资源
    最近更新 更多