Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java—销毁正在执行某些操作的对象_Java_Multithreading - Fatal编程技术网

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

Java—销毁正在执行某些操作的对象,java,multithreading,Java,Multithreading,我看了一些关于Java中析构函数的帖子,了解到Java中没有析构函数,但我不知道如果没有析构函数,我需要在应用程序中做什么 我的应用程序允许用户创建一系列WebCrawler,这些WebCrawler保存在arraylist中。每个爬虫程序都有一个进度面板gui,显示已爬虫的页面等,并允许用户暂停该爬虫程序。但是,用户可能还希望“终止”该爬虫程序。 应该注意的是,Crawler类的每个实例都有一个Scraper类的实例,而Scraper类又有一个DatabaseConnection类的实例 我需

我看了一些关于Java中析构函数的帖子,了解到Java中没有析构函数,但我不知道如果没有析构函数,我需要在应用程序中做什么

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

我需要做什么才能让用户按下“Terminate”,让爬虫、它的刮板和刮板的数据库连接都“关闭”并从系统中删除


任何建议都将不胜感激。

JVM的垃圾收集器最终将从内存中删除任何没有更多引用的对象。删除对象最简单的方法是通过调用arrayList来删除对该对象的引用。remove(elementid)

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

来删除对该对象的引用。首先,您需要在单独的线程上运行它才能正常工作(您看到的关于Java GUI无响应的任何信息都是因为没有注意到这一点)


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

首先,您需要在不同的线程上运行该程序才能正常工作(您看到的关于Java GUI无响应的任何信息都是因为没有注意到这一点)

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

我会说:“好好地请求停止”

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

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

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

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

我会说:“请很好地停止”

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

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

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


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

阅读java并发:


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

在这里阅读java并发:


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

您可能想阅读更多关于Java资源管理和垃圾收集的内容。您将在这里找到一些有用的信息-。您可能会