Callable和Future学习笔记

一。

    1>Callable和Future接口介绍

          Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可以被创建为线程的来执行的类。

    2>Callable和Runnable比较

            1. Callable规定的方法是call,Runnable规定的方法是run

            2. callable的任务执行后可以返回值,Runnable的run是无返回值的

            3.call方法可以抛出异常,run方法不能抛出异常。我们可以根据call方法是否抛出异常进行不同操作(因为try-catch不应该作为控制流程的条件,所以不推荐这样做);

            4.运行callable任务可拿到一个Future对象,Future表示的是异步计算结果,它提供了检查计算是否完成的方法和等待计算完成检索计算结果的方法。通过Future对象可以了解任务的执行情况,可以取消任务的执行,还可以获取任务执行的结果。

    3>Future中的方法介绍

          1.future.get()将等待callable线程执行返回结果。future.get(timeout, unit)如果等待超时将抛出超时异常。

           2.future.cancel(boolean)将试图终端当前线程,boolean作用带研究

     例子测试,代码如下,注意被注掉的两个地方,可以去掉注释运行试试

    

public class CallableTest {
    public static class MyCallableClass implements Callable<String>{
        private int flag=0;
        public MyCallableClass(int flag){
            this.flag=flag;
        }
        @Override
        public String call() throws Exception {
            if(flag==3){
                while(true){
                    System.out.println("在执行线程3");
                    Thread.sleep(5000);
                    
                }
            }
            Thread.sleep(5000);
            return "线程"+flag+"执行完";
        }
    }
    public static void main(String[] args) {
        MyCallableClass callableClass=new MyCallableClass(0);
        MyCallableClass callableClass2=new MyCallableClass(1);
        MyCallableClass callableClass3=new MyCallableClass(2);
        ExecutorService service=Executors.newFixedThreadPool(3);
        try {
            Future<String> future2=service.submit(callableClass2);
            Future<String> future=service.submit(callableClass3);
//            System.out.println(future.cancel(false));
            System.out.println(future2.get());
            System.out.println(future.get());
            Future<String> future3=service.submit(callableClass);
            System.out.println("task3"+future3.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
//        catch (Exception e) {
//            e.printStackTrace();
//        }
        service.shutdownNow();
        
    }
}


转载于:https://my.oschina.net/u/2323537/blog/616718

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值