【问题标题】:How to stop the execution of the method in the thread in Java?如何停止Java线程中方法的执行?
【发布时间】:2015-03-19 10:08:22
【问题描述】:

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

【问题讨论】:

  • 这就是它的工作原理;)你只能要求另一个线程停止执行(使用interrupt()方法),而被中断的线程将如何响应这个中断

标签: java multithreading


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的回复。你对我的代码设计帮助很大!
猜你喜欢
  • 2019-12-29
  • 2016-06-30
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
  • 2014-07-10
  • 1970-01-01
  • 2012-08-02
  • 2016-07-07
相关资源
最近更新 更多