JAVA8-JDK自带Future,Callable,ExecutorService

admin
2022-11-20 / 0 评论 / 42 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2022年11月20日,已超过515天没有更新,若内容或图片失效,请留言反馈。

JAVA8-JDK自带Future,Callable,ExecutorService

代码示例:

package com.example.study.java8.funture;

import java.util.List;
import java.util.concurrent.*;

/**
 * 和自定义Future中block一样会卡住
 */
public class FutureInAction2 {
    public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {
        //创建一个单线程
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        //返回一个future,里面的操作可能还没完成,但不影响后续的操作。
        Future<String> future = executorService.submit(() -> {
            try {
                Thread.sleep(10000L);
                return "I'm finished";
            } catch (InterruptedException e) {
                return "I'm error";
            }
        });
        //没有结果会抛出,中断异常
        String value = future.get();
        System.out.println(value);
        //关闭进程
        executorService.shutdown();

        //shutdownNow关闭进程,但是会返回有那些进程还没有执行完。
        List<Runnable> runnables = executorService.shutdownNow();
    }
}

输出结果:

I'm finished //会阻塞等待操作计算完成,才输出结果。

String value = future.get();

也可以添加其它参数,设置等待时间,如果超过时间没返回值,就抛出异常。

//最后等10秒没拿到,就抛出异常。
String value = future.get(10, TimeUnit.MICROSECONDS);

代码示例:

package com.example.study.java8.funture;

import java.util.List;
import java.util.concurrent.*;

/**
 * 和自定义Future中block一样会卡住
 */
public class FutureInAction2 {
    public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {
        //创建一个单线程
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        //返回一个future,里面的操作可能还没完成,但不影响后续的操作。
        Future<String> future = executorService.submit(() -> {
            try {
                Thread.sleep(10000L);
                return "I'm finished";
            } catch (InterruptedException e) {
                return "I'm error";
            }
        });
        //没有结果会抛出,中断异常
//        String value = future.get();
        //最后等10秒没拿到,就抛出异常。
        String value = future.get(10, TimeUnit.MICROSECONDS);
        System.out.println(value);
        //关闭进程
        executorService.shutdown();

        //shutdownNow关闭进程,但是会返回有那些进程还没有执行完。
        List<Runnable> runnables = executorService.shutdownNow();
    }
}

抛出异常结果:

Exception in thread "main" java.util.concurrent.TimeoutException
    at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:204)

代码示例:

package com.example.study.java8.funture;

import java.util.List;
import java.util.concurrent.*;

/**
 * 和自定义Future中block一样会卡住
 */
public class FutureInAction3 {
    public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException {
        //创建一个单线程
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        //返回一个future,里面的操作可能还没完成,但不影响后续的操作。
        Future<String> future = executorService.submit(() -> {
            try {
                Thread.sleep(10000L);
                return "I'm finished";
            } catch (InterruptedException e) {
                return "I'm error";
            }
        });
        //判断future里面线程是否执行完成,没有执行完成,则继续等待10秒。
        while(!future.isDone()){
            Thread.sleep(10);
        }
        //最后执行完成,直接可以拿到结果
        System.out.println(future.get());
        //关闭进程
        executorService.shutdown();

        //shutdownNow关闭进程,但是会返回有那些进程还没有执行完。
        List<Runnable> runnables = executorService.shutdownNow();
    }
}

输出结果:

I'm finished  //while中会判断是否执行完成,没有完成继续等待,知道执行完成后,直接打印结果
2

评论 (0)

取消