我使用crawler4j创建了一个自定义抓取工具。在我的应用程序中,我创建了很多控制器,过了一段时间,系统中的线程数将达到最大值,JVM将抛出异常。即使我在控制器上调用ShutDown()
并将其设置为null
并调用System.gc()
,我的应用中的线程仍会保持打开状态,应用程序也会崩溃。
我使用了jvisualvm.exe
(Java VisualVM)并且看到我的应用程序在某一时刻点击 931 线程。
有没有办法可以立即杀死crawler4j项目的CrawlController
对象创建的所有线程? (或任何其他对象)
答案 0 :(得分:2)
我只花了2个小时就遇到了同样的问题。我终于发现了这个bug的来源。如果创建一个控制器,然后启动它,shutdown()
不会杀死任何创建的线程。相反,您必须使用以下内容:
controller.shutdown();
controller.getPageFetcher().shutdown();
其中controller
是您的CrawlController实例
我还在crawler4j项目页面上提出了这个问题,看起来这将由版本3.6的版本修复
答案 1 :(得分:2)
以法莲是对的。 Crawler4j中有两个问题:
https://code.google.com/r/yonid-crawler4j/
我已经尽力创建一个启动后正常关闭的版本(startunblocking) 以及在创建控制器但不运行启动函数的情况下使用forceShutdown。
答案 2 :(得分:0)
ShutDown()
请求线程完成他们的工作并在之后击落,但如果线程有无尽的任务,那么他们永远不会完成怎么办?您是否尝试过使用shutdownNow()
?这将在完成之前中断正在运行的任务并立即拍摄线程。