【问题标题】:Concurrent algorithm for interrupting and restarting a calculation用于中断和重新开始计算的并发算法
【发布时间】:2014-02-08 10:31:35
【问题描述】:

我正在开发一个应用程序,它允许用户调整几个参数,然后执行可能需要一分钟的计算,然后将结果显示给用户。

我希望用户能够调整参数并重新开始计算,终止当前计算的进度。

另外,从编程的角度来看,我希望能够阻塞直到计算完成或中断,并且能够知道哪个。

在伪代码中,这大致就是我要寻找的:

method performCalculation:
    interrupt current calculation if necessary
    asynchronously perform calculation with current parameters

method performCalculationBlock:
    interrupt current calculation if necessary
    perform calculation with current parameters
    if calculation completes:
        return true
    if calculation is interrupted:
        return false

到目前为止,我满足第一种方法,但我不确定如何修改它以添加阻塞功能:

private Thread computationThread;
private Object computationLock = new Object();
private boolean pendingComputation = false;

...

public MyClass() {
    ...

    computationThread = new Thread() {
        public void run() {
            while (true) {
                synchronized (computationLock) {
                    try {
                        computationLock.wait();
                        pendingComputation = false;
                        calculate();
                    } catch (InterruptedException e) {
                    }
                }
            }
        }

        private void checkForPending() throws InterruptedException {
            if (pendingComputation)
                throw new InterruptedException();
        }

        private void calculate() {
            ...
            checkForPending();
            ...
            checkForPending();
            ...
            // etc.
        }
    };
    computationThread.start();
}

private void requestComputation() {
    pendingComputation = true;
    synchronized (computationLock) {
        computationLock.notify();
    }
}

添加此功能的最佳方法是什么?或者有没有更好的方法来设计程序来完成所有这些事情?

【问题讨论】:

    标签: java multithreading concurrency locks


    【解决方案1】:

    如果您使用的是 JDK 5 或更早版本,请检查 java.util.concurrent 包。 FutureTask 类似乎符合您的要求:具有阻塞功能的可取消异步计算。

    【讨论】:

    • 这绝对是我想要的方向,我已经让它有点工作,但我无法取消当前的计算。能否提供一个简短的代码示例?
    猜你喜欢
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多