|
| 1 | +import java.util.concurrent.*; |
| 2 | + |
| 3 | +/** |
| 4 | + * 演示get的超时方法 |
| 5 | + * cancel方法 —> 取消任务的执行 |
| 6 | + * 如果任务已经开始执行了,那么这个取消方法不会直接取消该任务,而是根据传入的参数做判断 |
| 7 | + * <p> |
| 8 | + * true -> 任务能处理interrupt |
| 9 | + * false -> 仅用于避免启动尚未启动的任务(适用于未能处理interrupt、不清楚任务是否支持取消、需要等待已经开始的任务执行完成) |
| 10 | + * |
| 11 | + * @Author: zzStar |
| 12 | + * @Date: 10-13-2020 10:21 |
| 13 | + */ |
| 14 | +public class Timeout { |
| 15 | + |
| 16 | + private static final ExecutorService executorService = Executors.newFixedThreadPool(10); |
| 17 | + |
| 18 | + static class Ad { |
| 19 | + String name; |
| 20 | + |
| 21 | + public Ad(String name) { |
| 22 | + this.name = name; |
| 23 | + } |
| 24 | + |
| 25 | + @Override |
| 26 | + public String toString() { |
| 27 | + return "Ad{" + |
| 28 | + "name='" + name + '\'' + |
| 29 | + '}'; |
| 30 | + } |
| 31 | + } |
| 32 | + |
| 33 | + //任务 -> 3秒中的时间返回广告 |
| 34 | + static class FetchTask implements Callable<Ad> { |
| 35 | + @Override |
| 36 | + public Ad call() { |
| 37 | + try { |
| 38 | + Thread.sleep(3000); |
| 39 | + } catch (InterruptedException e) { |
| 40 | + System.out.println("sleep期间被中断了"); |
| 41 | + return new Ad("被中断时候的默认广告"); |
| 42 | + } |
| 43 | + return new Ad("Alibaba"); |
| 44 | + } |
| 45 | + } |
| 46 | + |
| 47 | + public void printAd() { |
| 48 | + Future<Ad> adFuture = executorService.submit(new FetchTask()); |
| 49 | + Ad ad; |
| 50 | + try { |
| 51 | + //给出4秒的超时时间 |
| 52 | + ad = adFuture.get(4000, TimeUnit.MILLISECONDS); |
| 53 | + } catch (InterruptedException e) { |
| 54 | + ad = new Ad("被中断时候的默认广告"); |
| 55 | + } catch (ExecutionException e) { |
| 56 | + ad = new Ad("异常时候的默认广告"); |
| 57 | + } catch (TimeoutException e) { |
| 58 | + ad = new Ad("超时时候的默认广告"); |
| 59 | + System.out.println("超时,未获取到广告"); |
| 60 | + |
| 61 | + //是否中断正在执行的任务 |
| 62 | + //传入false,还未被执行的任务会被标记,任务会被正常取消,未来也不会被执行 |
| 63 | + boolean cancel = adFuture.cancel(false); |
| 64 | + System.out.println("cancel = " + cancel); |
| 65 | + } |
| 66 | + executorService.shutdown(); |
| 67 | + System.out.println(ad); |
| 68 | + } |
| 69 | + |
| 70 | + public static void main(String[] args) { |
| 71 | + Timeout timeout = new Timeout(); |
| 72 | + timeout.printAd(); |
| 73 | + } |
| 74 | + |
| 75 | +} |
0 commit comments