首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java -销毁正在执行某些操作的对象

Java -销毁正在执行某些操作的对象
EN

Stack Overflow用户
提问于 2011-07-08 04:19:05
回答 4查看 175关注 0票数 0

我看过Java中关于析构函数的帖子,了解到Java没有析构函数,但我很困惑,如果没有析构函数,我的应用程序需要做什么。

我的应用程序允许用户创建一系列的网络爬虫,这些爬虫保存在一个数组列表中。每个crawler都有一个进度面板gui,显示已爬行的页面等,并允许用户暂停该爬虫。但是,用户可能还想“终止”该爬虫程序。应该注意的是,Crawler类的每个实例都有一个Scraper类的实例,而Scraper类又有一个DatabaseConnection类的实例。

我需要做什么才能让用户按下"Terminate“,对于那个爬行器,它的抓取器,以及抓取器的DatabaseConnection,都被”关闭“并从系统中删除。

任何建议都将不胜感激。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-07-08 04:25:26

首先,您需要让它在单独的线程上运行才能正常工作(您看到的关于Java GUI没有响应的任何东西都是因为没有注意到这一点)。

然后,技巧是让线程执行操作,定期检查给定条件是否仍然为真,然后让取消按钮进入并重置条件,使其为假(如设置字段或调用setKeepGoing( false )方法)。当线程发现它们被要求停止时,它们会停止并相应地进行清理。

票数 2
EN

Stack Overflow用户

发布于 2011-07-08 04:24:19

JVM的垃圾收集器最终会从内存中删除任何不再引用的对象。删除对象的最简单方法是通过调用arrayList.remove(elementid)删除对它的引用

票数 1
EN

Stack Overflow用户

发布于 2011-07-08 05:50:44

我会说:“请善意地停止”

Thread.stop已被弃用,因为它允许您在运行过程中停止操作,从而使应用程序处于潜在的不一致状态。在您的特定情况下,不能依赖垃圾收集来清理打开的DB连接,因此您需要在逻辑中对其进行管理。

首先,我同意其他答案,即您的应用程序需要在用户界面和实际处理-crawling之间进行分层。正如您所解释的,爬虫通常是长时间运行的任务。因此,它们将需要存在于自己的执行线程中,无论是在专用的Thread中,还是使用[ExecutorService][1]时更好。

然后,您可以使用不同的方法来停止长期运行的任务:您可以使用线程Interruption来通知给定的线程及其相关的执行应该停止服务,或者,您可以使用一些应用程序级别的逻辑向该任务发送poison-pill。使用ExecutorService,您可以保留服务返回的[Future][4],并使用它们来请求取消任务。

在您的中断逻辑中,记得在清理文件和数据库连接等资源之后进行清理。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6616634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档