如何在Java中的线程中停止执行该方法?

时间:2015-03-19 10:08:23

标签: java multithreading

我有J2EE项目,它使用框架struts2和Tomcat。有两个动作:“启动任务”和“停止任务”。据我了解,当用户运行任务“启动任务”时,Tomcat会启动执行任务的线程。用户可以单击“停止任务”,然后Tomcat启动第二个线程,它需要停止第一个线程。执行任务非常大的动作方法。有DB和计算的查询。为了停止线程,我使用第一个线程的interrupt()interrupt()只更改了flag的值,但方法中的代码继续运行。我在方法的不同部分检查中断标志(Thread.currentThread().isInterrupted()),如果线程被中断,那么我使用“return”。还有其他办法吗?

1 个答案:

答案 0 :(得分:1)

您的实施是正确的。建议您使用的方式。其他方法是使用Thread.stop()但不推荐使用此方法,因为java 1.1和no-one应该使用它。这个方法就像Unix中的kill -9一样,即它只会杀死可能导致程序进入不一致状态的线程并且可能产生资源泄漏。

显然你可以改进你的设计。你说方法很大。一般方法不应超过20行。好吧,50是最大值。如果您的方法太大,请将其分解为较小的任务,并在每个任务之前检查isInterrupted()

前进到OO世界:使用方法Task创建界面perform()。 (姓名无关紧要。您可以选择其他名称)。 每个子任务应该在单独的类中实现,并且应该实现此接口。然后创建实现InterruptionChecker的特殊Task并执行其他任务。它检查线程是否被中断,如果没有,则运行有效负载任务。此模式称为包装器或装饰器。

现在你的“大”方法应该只循环运行所有任务。当线程被破坏时,不执行任何新任务。