如何从Callable <object>调用方法强制停止方法执行

时间:2017-05-05 14:17:06

标签: java

我有一个方法:

public class Datasource  {

    public void create() throws MyException{

     // can take more time than expected

    }
}

我想为此方法添加超时。

我试过了:

public class Test {

    public static void main(String[] args) throws MyException {
        runWithTimeout(new Datasource());
    }

    public static void runWithTimeout(final Datasource ds) throws MyException {

        ExecutorService executor = Executors.newSingleThreadExecutor();
        Callable<Object> task = new Callable<Object>() {
            public Object call() throws MyException {
                ds.create();
                return null;
            }
        };
        Future<Object> future = executor.submit(task);
        try {
            future.get(5, TimeUnit.SECONDS);

        } catch (TimeoutException tex) {
            throw new MyException("TimeoutException. Caused By", tex);

        } catch (InterruptedException iex) {
            throw new MyException("InterruptedException. Caused By", iex);

        } catch (ExecutionException eex) {
            throw new MyException("InterruptedException. Caused By", eex);

        } finally {
            future.cancel(true);
            executor.shutdown();
        }
    }
}

但是create方法仍在运行。我该如何强行阻止它。

我无法修改create()方法。所以我无法在isInterrupted()方法中的当前线程上添加create()

1 个答案:

答案 0 :(得分:0)

Future.cancel电话不会终止正在进行的流程。它更像是对未来任务的暗示,这个被取消了。除此之外,没有保证从第三方库中停止Thread的方法。您唯一希望的是迭代ThreadGroup并在其上调用interrupt(),然后希望正在进行的Thread处理{{1}并取消自己。