我已经看过Java中有关析构函数的帖子,并且已经了解到Java没有它们,但是如果不存在析构函数,我对我在应用程序中需要做什么感到困惑。
我的应用程序允许用户创建一系列摄像头,这些摄像头保存在一个arraylist中。每个Crawler都有一个进度面板gui,显示已爬网的页面等,并允许用户暂停该爬虫。但是,用户可能还想“终止”该爬虫。 应该注意的是,Crawler类的每个实例都有一个Scraper类的实例,而Scraper类又有一个DatabaseConnection类的实例。
我需要做什么才能让用户按下“终止”,然后对该Crawler及其Scraper和Scraper的DatabaseConnection进行“关闭”并从系统中删除。
任何建议都将受到赞赏。
答案 0 :(得分:2)
首先,你需要在不同的线程上运行才能正常运行(你看到的任何关于Java GUI没有响应的事情是因为没有注意到这一点。)
然后诀窍是让线程做事,定期检查给定条件是否仍然为真,并让你的取消按钮进入并重置条件,使其为假(如设置字段或调用setKeepGoing(false)metod)。当线程然后发现它们被要求停止时,它们会相应地停止并清理。
答案 1 :(得分:1)
JVM的垃圾收集器最终将从内存中删除任何没有更多引用的对象。删除对象的简单方法是通过调用arrayList.remove(elementid)删除对它的引用
答案 2 :(得分:0)
我会说:“请好好停下来”。
Thread.stop已从API中弃用,因为它允许您在飞行途中停止运行,从而使应用程序处于潜在的不一致状态。在您的特定情况下,不能依赖垃圾收集来清理保持打开的数据库连接,因此您需要在逻辑中管理它。
首先,我同意其他答案,因为您的应用需要在用户界面和实际处理之间进行分层 - 在您的情况下进行抓取。正如您所解释的,爬虫通常是长时间运行的任务。因此,他们需要生活在他们自己的执行线程中,无论是专用的Thread
还是更好的使用[ExecutorService][1]
。
然后,您有不同的方法可以停止长时间运行的任务:您可以使用线程Interruption来表示给定线程及其相关执行应停止服务,或者您可以使用某些应用级逻辑发送poison-pill到任务。使用ExecutorService
,您可以保留服务返回的[Future][4]
并使用它们请求取消您的任务。
在中断逻辑中,请记住在文件和数据库连接等资源之后进行清理。
答案 3 :(得分:0)
在这里阅读java并发:http://download.oracle.com/javase/tutorial/essential/concurrency/index.html
每个抓取工具都是自己的Runnable,可以执行其任务。当您为爬网程序提供terminate命令时,您可以在爬网程序中实现一些代码,这些代码将释放资源(数据库连接等)并停止执行。如果您正在使用执行程序框架,您还可以使用在安排执行程序时提供的Future,并在完成后调用'shutdown'以确保清除Thread。