Java - 终止线程中的方法

标签 java multithreading

我有一个 Java 线程,它的运行方法可以计算很多东西。您可以将其视为一系列数学语句,如下所示。请注意,每个计算都可能使用其他方法,而这些方法又可能有额外的循环等。

public void run() {
   [computation 1 goes here here that takes a few seconds]
   [computation 2 goes here that takes a few seconds]
   ....
   [computation 30 goes here that takes a few seconds]
}

有一个 GUI 可以在这些语句产生结果时打印这些语句的输出,我希望用户能够随时说“停止”。下面是我想到的两种方法


方法 1:许多 boolean 检查 [看起来很糟糕]

private boolean stop;
public void run() {
   if(!stop)
       [computation 1 goes here here that takes a few seconds]
   if(!stop)
       [computation 2 goes here that takes a few seconds]
   ....
   if(!stop)
       [computation 30 goes here that takes a few seconds]
}

在这个方法中,一旦停止标志被设置为真,计算就会结束。注意这看起来有多傻,有 30 个 if 语句。重要的是,这里的关键问题是设置这些条件的频率。请注意,每行的计算不一定是单行。极端一点,run() 方法中的每一行都应该在其上方调用 if(!stop) 吗?这似乎不是一个好的设计。

方法 2:概括计算 [不能这样做]

pirivate boolean stop;
public void run() {
   for(int i = 0; i < computationsN && !stop; i++) {
       computuations.get(i).compute();
}

我想会建议使用这种方法,所以我想简单地说,在我的情况下这是不可能的,考虑到为简单起见我称之为“计算”的行的巨大变化。我通常为基本 while 循环的线程执行此操作,并且它非常适用于此类线程。但在这种情况下,run() 方法只是一个巨大的可变代码方法。


还有其他解决方案吗?看来这应该是一个普遍的问题。提前致谢!

最佳答案

你想做的实际上可以用方法 2 完成,但你必须使用 Strategy Pattern , 实际上是您还需要的另一件事,因为它可以在一行中简化您的计算,就像您在方法 2 中实际所做的那样。

它是这样工作的,它让你通过做多态来改变下一个可执行的算法。

enter image description here

因此,首先你必须在不同的类中创建所有算法,并且每个算法都必须使用一个方法实现一个接口(interface)(它可以称为 Computable ),即你的 compute () 方法。

例如

public interface Computable {
    public void compute();
}

你的算法类可能是这样的:

  public class AlgorithmX implements Computable {

    @Override
    public void compute() {
        // TODO Your Real Computation here for the Algorithm X
    }
  }

然后在您的 for 循环中,您的 computations 集合(或数组)填充了实现 Computable 的对象,即您的算法对象.

for(int i = 0; i < computations && !stop; i++) {
   computuations.get(i).compute();
}

所以你使用方法 2 的方法是正确的,我希望你的方法现在更清楚了。

干杯!

关于Java - 终止线程中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21718042/

相关文章:

java - 在单独的选项卡中打开多个 pdf 文件

Python GIL 防止 CPU 使用率在多核机器中超过 100%?

c++ - 是否可以在没有 pthread_join() 的情况下使用 pthreads?

c# - C#/.NET 4.0+ 实现可取消后台线程的方法是什么?

multithreading - 在多线程应用程序中使用屏障的真实示例是什么?

java - 为什么在设置 PhantomJS 驱动程序时出现错误?

java - TreeMap - 搜索时间复杂度

java - 从 ResultSet 中的资源获取 URI

java - X-editable 不在 submit() 上发送 Json

c++ - vector 的lock_guards