タイムアウト後にタスクをキャンセルするにはどうすればよいですか?

StackOverflow https://stackoverflow.com//questions/24027314

質問

いくつか持っています Task ハングする可能性がある I/O ブロック操作を実行する (ファイルをファイルからフェッチする) URL)

task = new Task<List<WSDLOperation>>() {
            @Override
            protected List<WSDLOperation> call() {
                List<WSDLOperation> services = new ArrayList<>();
                try {
                    services = WSDLService.createService(wsdlURL).getOperations();
                } catch (Exception ex) {
                    LOG.log(Level.WARNING, "Can't reach {0}", wsdlURL);
                }
                return services;
            }
        };

    }

方法 createService 何も投げずに永遠に待つことができる Exception。(グローバル (static public)ExecutorService メインクラスで定義されています)。

役に立ちましたか?

解決

Future を使用してタイムアウト後にタスクをキャンセルする方法:

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class Test {
    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Task t = new Task();
        Future<String> future = executor.submit(t);

        try {
            System.out.println("Started..");
            System.out.println(future.get(5, TimeUnit.SECONDS)); // throws
                                                                    // TimeoutException
            System.out.println("Finished!");
        } catch (TimeoutException e) {
            future.cancel(true);
            System.out.println("Terminated!");
        }
    }
}

class Task implements Callable<String> {
    @Override
    public String call() throws Exception {
        for (int i = 0; i < 1000; i++) {
            Thread.sleep(1000);
            System.out.println("task running!");
        }
        return "Ready!";
    }
}

他のヒント

あなたが使っているのは ExecutorService, したがって、タスクを送信した後にそれを行うことができます。

ExecutorService executor = // ...  
Future<?> future = executor.submit(task);
future.get(5, TimeUnit.MINUTES); // timeout 5 mins
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top