杀死对象创建的线程

时间:2013-02-01 10:48:15

标签: java multithreading web-crawler crawler4j

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

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

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

3 个答案:

答案 0 :(得分:2)

我只花了2个小时就遇到了同样的问题。我终于发现了这个bug的来源。如果创建一个控制器,然后启动它,shutdown()不会杀死任何创建的线程。相反,您必须使用以下内容:

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

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

答案 1 :(得分:2)

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

  1. 未在CrawlController中关闭Environment对象。
  2. 未在CrawlController中关闭PageFetcher对象。
  3. https://code.google.com/r/yonid-crawler4j/

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

答案 2 :(得分:0)

ShutDown()请求线程完成他们的工作并在之后击落,但如果线程有无尽的任务,那么他们永远不会完成怎么办?您是否尝试过使用shutdownNow()?这将在完成之前中断正在运行的任务并立即拍摄线程。