使用FutureTask和Callable实现多线程

2021-06-25  本文已影响0人  砌月东谷

Java要创建一个线程,可以继承自Thread类,或者实现Runable接口,但JUC还提供了另外一种方式,就是通过Callable+FutureTask创建并使用线程

1.FutureTask

Future是JDK提供的用于处理多线程环境下异步问题的一种模式,而FutureTask就是对Future模式的一种实现

Future模式的最大好处就是客户端在发出请求后,可以马上得到一个反馈结果,而不用一直等待着服务端来处理

在使用FutureTask时,get()方法就用于返回服务端真正处理后的真实值,由于服务端不一定马上能处理完毕,因此调用get()方法时候会出现一定时间阻塞,等待服务器处理完毕

2 .Callable

Callable和Runable类似,都是创建线程的上级接口,但也有所不同

  1. 使用Callable创建线程,需要重写call方法,使用Runable创建线程,需要重写run方法
  2. run方法没有返回值,call方法却有一个类型为泛型的返回值,而且可以通过FutureTask的get方法来接收次返回值
  3. get方法是一个闭锁式的阻塞方法,该方法会一直等待,直到call方法执行完毕并且return返回值为止
  4. call和run方法一样,也是通过start()来调用
public class TestCallable {
    public static void main(String[] args) {
        //获取Callable的线程对象
        MyCallable myCallable=new MyCallable();
        //将线程对象包装成futureTask对象,并接收线程的返回值
        FutureTask<Integer> res=new FutureTask<>(myCallable);
        //运行线程
        new Thread(res).start();

        try {
            Integer integer = res.get();
            System.out.println(integer);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

    }
}

class MyCallable implements Callable<Integer>{

    @Override
    public Integer call() throws Exception {
        System.out.println("线程计算1到100的和");
        int sum=0;
        for(int i =1;i<100;i++){
            sum+=i;
        }
        return sum;
    }
}
上一篇下一篇

猜你喜欢

热点阅读