我基于以下假设来回答这个问题:无法更改计算代码以检查 boolean stop 或 System.currentTimeMillis() 等标志。如果这是真的,那么这是一个可能的解决方案。
您需要做的是在每次预期新结果时生成一个新计算。我包含的这个程序确实存在一些问题,例如从不确保计算完成导致无限数量的线程。同样,这是基于您无法过早停止计算的假设。如果您确实有该选项,您可以在计算循环中设置一个标志以提前退出该方法。
我不知道为什么我不能让代码样式正常工作,我是这个网站的新手,任何帮助将不胜感激
您将维护一堆已处理的结果。如果您始终获得最佳结果,那么它将是您在该时间点可能处理的最新结果。我在这里创建一个堆栈而不是仅仅覆盖之前的结果的原因是你需要对之前的计算做一些事情。
在我的例子中performCalculation的主体只对模拟你提到的环境很重要。
您可以创建一个新线程,或使用现有线程不断处理抛出到results 的结果。
import java.util.Random;
import java.util.Stack;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.atomic.AtomicInteger;
public class Main
{
private static int CALCULATION_THRESHOLD = 2000;
private static Stack<Object> results = new Stack<Object>();
private static Object resultTrigger = new Object();
public static void main(String[] args)
{
Timer calculationTimer = new Timer(true);
calculationTimer.schedule(new TimerTask() {
@Override
public void run()
{
Thread calculationThread = new Thread() {
public void run() {
Object result = performCalculation();
results.push(result);
synchronized(resultTrigger) {
resultTrigger.notifyAll();
}
}
};
calculationThread.start();
}
}, CALCULATION_THRESHOLD, CALCULATION_THRESHOLD);
synchronized(resultTrigger) {
if (results.isEmpty()) {
// This is bad as it will never end if you don't
// get a result, add a timeout here.
try { resultTrigger.wait(); }
catch (InterruptedException ex) {}
}
}
// Get the next result
Object result = results.pop();
System.out.println ("Latest result is : " + result);
// Do something with the remaining results or throw
// them away
results.clear();
}
private static AtomicInteger counter = new AtomicInteger();
// This is the method we are assuming can't be
// changed to check for a stop flag.
public static Object performCalculation()
{
int calcID = counter.addAndGet(1);
System.out.println ("Calculation " + calcID + " is running.");
Random randomGenerator = new Random();
int sleep = randomGenerator.nextInt(10000);
// Ensure we sleep for at least 2 seconds
try { Thread.sleep(sleep + 2000); }
catch (InterruptedException ex) {}
return String.valueOf(counter.get());
}
}
示例输出:
运行 1
计算 1 正在运行。
计算 2 正在运行。
计算 3 正在运行。
最新结果是:3
运行 2
计算 1 正在运行。
计算 2 正在运行。
计算 3 正在运行。
计算 4 正在运行。
计算 5 正在运行。
最新结果是:5
运行 3
计算 1 正在运行。
计算 2 正在运行。
最新结果是:2