我有一个 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 中实际所做的那样。
它是这样工作的,它让你通过做多态来改变下一个可执行的算法。
因此,首先你必须在不同的类中创建所有算法,并且每个算法都必须使用一个方法实现一个接口(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/