2015-03-19 110 views
1

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

+0

这是如何工作的,)你只能问其他线程停止执行(与中断()方法),而且它是由被中断的线程就如何将这种中断 – pomkine 2015-03-19 10:12:45

回答

1

你的实现是正确的。建议您使用的方式。其他的方法是使用Thread.stop(),但是这个方法自java 1.1以后不推荐使用,也没有人应该使用它。这种方法类似于Unix中的kill -9,即它只是杀死可能导致程序进入不一致状态并可能产生资源泄漏的线程。

很明显,你可以改善你的设计。你说这个方法非常大。一般方法不应超过20行。那么,50是最大的。如果您的方法如此之大,请将其分解为更小的任务,并在每项任务之前检查isInterrupted()

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

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

+0

回应感谢您的答复。你非常帮我设计代码! – Katerina 2015-03-19 11:16:41

+0

所以,不要犹豫,接受答案:) – AlexR 2015-03-19 11:45:58