2

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

我使用了jvisualvm.exe(Java VisualVM)并看到我的应用程序在某一时刻达到了931个线程。

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

4

3 回答 3

2

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

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

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

于 2014-08-25T20:19:15.760 回答
2

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

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

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

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

于 2014-08-27T13:17:05.050 回答
0

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

于 2013-02-01T10:57:21.040 回答