zoukankan      html  css  js  c++  java
  • Callable与Runable接口 submit与execute区别

    execute(Runnable x) 没有返回值。可以执行任务,但无法判断任务是否成功完成。

    submit(Runnable x) 返回一个future。可以用这个future来判断任务是否成功完成。

    在Java5之后,任务分两类:一类是实现了Runnable接口的类,一类是实现了Callable接口的类。

    两者都可以被ExecutorService执行

    Future future = pool.submit(new RunnableTest("Task2"));
            
            try {
                if(future.get()==null){//如果Future's
     get返回null,任务完成
                    System.out.println("任务完成");
                }
            } catch (InterruptedException e) {
            } catch (ExecutionException e) {
                //否则我们可以看看任务失败的原因是什么
                System.out.println(e.getCause().getMessage());
            }
    Runnable任务没有返回值(见上面代码),Callable中的call()方法类似Runnable的run()方法,就是前者有返回值,后者没有。

    同样,将Runnable的对象传递给ExecutorService的submit方法,则该run方法自动在一个线程上执行,并且会返回执行结果Future对象,但是在该Future对象上调用get方法,将返回null。

    当将一个Callable的对象传递给ExecutorService的submit方法,则该call方法自动在一个线程上执行,并且会返回执行结果Future对象。

    import java.util.concurrent.Callable;
    import java.util.concurrent.CompletionService;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.ExecutorCompletionService;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Future;
    import java.util.concurrent.TimeUnit;


    public class CallableAndFuture {
        
        public static void main(String[] args) {
            
            //1s内得不到结果就抛异常
            ExecutorService threadPool=Executors.newSingleThreadExecutor();
            
            Future<String> future=threadPool.submit(new Callable<String>() {

                @Override
                public String call() throws Exception {
                    Thread.sleep(2000);//休息2s
                    return "hello";
                }
            });
            
            try {
                System.out.println(future.get(1000, TimeUnit.MILLISECONDS));
            } catch (InterruptedException e) {
        
                e.printStackTrace();
            } catch (Exception e) {
            
                e.printStackTrace();
            }
            
            //提交一组任务,take方法返回已完成的任务的一个任务对应的Future对象
            
            ExecutorService threadPool2=Executors.newFixedThreadPool(10);
            CompletionService<Integer> completionService=new ExecutorCompletionService<>(threadPool2);
            for (int i=1;i<=10;i++){
                final  int seq=i;
            completionService.submit(new Callable<Integer>() {

                @Override
                public Integer call() throws Exception {
                    Thread.sleep(new Random().nextInt(3000));
                    return seq;
                }
                
            });
            }
            
             for (int i=1;i<=10;i++){
            try {
                System.out.println(completionService.take().get());
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }
            }
        }

    }


    参考文章:

    submit与execute区别

    http://blog.csdn.net/ryantotti/article/details/6956175

    Callable与Runable接口

    http://blog.csdn.net/yuzhiboyi/article/details/7775266

  • 相关阅读:
    linux下详解shell中>/dev/null 2>&1
    关于使用sublime的一些报错异常退出的解决方法
    Linux下如何挂载文件,并设置开机自动挂载
    关于/var/log/maillog 时间和系统时间不对应的问题 -- 我出现的是日志时间比系统时间慢12个小时
    如何在含有json类型的字段上建立多列索引
    文件大小
    SVN
    索引
    MD5验证
    协议适配器错误的问题
  • 原文地址:https://www.cnblogs.com/yuyu666/p/10075563.html
Copyright © 2011-2022 走看看