このようなことができます。
ExecutorService executorService = acquireExecutorService();
final int readTimeout = 1000;
final int connectionTimeout = 2000;
final File target = new File("target");
final URL source = new URL("source");
Future<?> task = executorService.submit(new Runnable() {
@Override
public void run() {
try {
FileUtils.copyURLToFile(source, target, connectionTimeout, readTimeout);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
});
try {
task.get(30, TimeUnit.SECONDS);
} catch (InterruptedException | ExecutionException e) {
//handle exceptions
} catch (TimeoutException e) {
task.cancel(true); //interrupt task
}
Executor サービスを使用すると、ファイルを非同期でダウンロードできます。task.get(30, TimeUnit.SECONDS);
ダウンロードが完了するまでの待機時間を指定します。FileUtils.copyURLToFile()
間に合わない場合は、タスクをキャンセルして中断することもできますが、スレッドの中断フラグをチェックしないと思うので、スレッドの中断はおそらく機能しません。これは、ダウンロードが引き続きバックグラウンドで行われることを意味します。本当にダウンロードを停止したい場合は、スレッドが中断されたときにダウンロードを停止するために、copyURLToFile
自分で実装して定期的にチェックする必要があります。Thread.interrupted()