美文网首页
使用FutureTask和Callable实现多线程

使用FutureTask和Callable实现多线程

作者: 砌月东谷 | 来源:发表于2021-06-25 06:34 被阅读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;
        }
    }
    

    相关文章

      网友评论

          本文标题:使用FutureTask和Callable实现多线程

          本文链接:https://www.haomeiwen.com/subject/bgpwyltx.html