【问题标题】:Java - Destroying objects that are in the process of doing somethingJava - 销毁正在做某事的对象
【发布时间】:2011-07-07 20:19:05
【问题描述】:

我查看了有关 Java 中的析构函数的帖子,并了解到 Java 没有它们,但如果没有析构函数之类的东西,我对我需要在我的应用程序中做什么感到困惑。

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

我需要做什么才能使用户能够按下“终止”,并且该 Crawler 及其 Scraper 和 Scraper 的 DatabaseConnection 都将“关闭”并从系统中删除。

任何建议将不胜感激。

【问题讨论】:

标签: java multithreading


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢 BK。因此,如果我不使用线程,那么 arrayList.remove(elementid) 应该可以工作,但是我必须先进入爬虫并让 scraper = null 吗?
    • 我看不出你如何在不使用线程的情况下实现你的程序(实际上我确实看到了可能性,只是希望没有人会在比嵌入式系统更大的任何东西上这样做)。
    • @user725687 要回答你的问题,不,如果对象 A 引用对象 B,对象 B 引用对象 C,假设您没有其他对 B 或 C 的引用,删除 A 将导致 B 和C 也最终被垃圾收集器收集。也就是说,我同意其他 cmets 在实践中您将希望使用线程来管理多个爬虫。
    【解决方案3】:

    我会说:“请停下来”

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

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

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

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

    【讨论】:

      【解决方案4】:

      在这里阅读 java 并发:http://download.oracle.com/javase/tutorial/essential/concurrency/index.html

      每个爬虫都有自己的 Runnable 来执行其任务。当您给爬虫一个终止命令时,您可以在爬虫中实现一些代码,这些代码将释放资源(数据库连接等)并停止执行。如果您使用的是 executor 框架,您还可以使用调度 Executor 时提供的 Future 并在完成后调用“shutdown”以确保清理线程。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-20
        • 2012-07-09
        • 1970-01-01
        • 2015-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多