多线程--创建线程Callable

        在创建线程时,前面都是通过Thread,Runnable接口来创建的,这样创建的线程的入口函数,run方法是没有返回值的,如果我们需要线程返回一个值,就需要使用Callable接口来创建线程.

        创建实例:

Callable<Integer> callable = new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                int sum = 0;
                for (int i = 0; i <= 1000; i++) {
                    sum += i;
                }
                return sum;
            }
};

callable在创建时需要传入一个泛型类,这个泛型类就是我们所需要的返回值类型.

        callable创建线程:

        Callable对象不能直接传入Thread使用,需要配合FutureTask来使用.

        直接传入报错,因为Thread的构造方法没有提供这个版本.

        正确使用:先将callable对象传入FutureTask中,再将FutureTask对象传入Thread.

Callable<Integer> callable = new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                int sum = 0;
                for (int i = 0; i <= 1000; i++) {
                    sum += i;
                }
                return sum;
            }
        };
FutureTask<Integer> futureTask = new FutureTask<>(callable);
Thread t = new Thread(futureTask);
t.start();

                FutureTask也需要传入泛型类,和callable传入的泛型类相同即可.

        获取返回值

        引入Callable就是为了解决Runnable接口无法返回的问题,想要获取返回值,只需要使用FutureTask提供的get方法即可,get方法会阻塞等待线程完成任务,然后拿到返回值

public static void main(String[] args) throws ExecutionException, InterruptedException {
        Callable<Integer> callable = new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                int sum = 0;
                for (int i = 0; i <= 1000; i++) {
                    sum += i;
                }
                return sum;
            }
        };
        FutureTask<Integer> futureTask = new FutureTask<>(callable);
        Thread t = new Thread(futureTask);
        t.start();
        System.out.println(futureTask.get());
    }

         执行结果正确.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值