Runnable,Callable,Future三者的对比和区别

小熊博客
2021-09-17 / 0 评论 / 107 阅读
温馨提示:
本文最后更新于2021-09-17,若内容或图片失效,请留言反馈。

Runnable

使用方式

方式1:线程启动

使用实现runnable接口的类创建Thread对象,启动Thread对象

public class TestRunnable {
    public static class RunnableImpl implements Runnable {
        @Override
        public void run() {
            System.out.println("线程启动");
        }
    }

    public static void main(String[] args) {
        RunnableImpl r = new RunnableImpl();
        Thread thread = new Thread(r);
        thread.start();
    }
}
方式2:线程池调用

结合ExecutorService

public class TestRunnable {
    public static class RunnableImpl implements Runnable {
        @Override
        public void run() {
            System.out.println("线程启动");
        }
    }

    public static void main(String[] args) {
        RunnableImpl r = new RunnableImpl();
        ExecutorService e = Executors.newCachedThreadPool();
        e.submit(r);
        e.shutdown();
    }
}

callable

和Runnable的区别

Callable能返回线程的执行结果,并且会抛出异常。Callable只能通过线程池调用

使用方式

    public static void main(String[] args) {
        ExecutorService e = Executors.newCachedThreadPool();
        Future<String> f = e.submit(new Callable<String>() {
            @Override
            public String call() throws Exception {
                return "线程启动成功";
            }
        });
    }

Future

Future保存异步计算的结果,可以在我们执行任务时去做其他工作,并提供了以下几个方法

cancel(boolean mayInterruptIfRunning):试图取消执行的任务,参数为true时直接中断正在执行的任务,否则直到当前任务执行完成,成功取消后返回true,否则返回false

isCancel():判断任务是否在正常执行完前被取消的,如果是则返回true

isDone():判断任务是否已完成

get():等待计算结果的返回,如果计算被取消了则抛出

get(long timeout,TimeUtil unit):设定计算结果的返回时间,如果在规定时间内没有返回计算结果则抛出TimeOutException