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

上一篇:git tag — 标签相关操作


下一篇:[转]maven编译时出现读取XXX时出错invalid LOC header (bad signature)