码迷,mamicode.com
首页 > 其他好文 > 详细

Callable与Runable接口 submit与execute区别

时间:2015-08-19 17:25:14      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:submit与execute callable与runable


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对象。

 

package test;
import java.util.ArrayList; 
import java.util.List; 
import java.util.concurrent.*;
/** 
 * Callable接口测试 
* 
 * @author leizhimin 2008-11-26 9:20:13 
 */
public class CallableDemo { 
         public static void main(String[] args) { 
                 ExecutorService executorService = Executors.newCachedThreadPool(); 
                 List<Future<String>> resultList = new ArrayList<Future<String>>();
                 //创建10个任务并执行
                for (int i = 0; i < 10; i++) { 
                         //使用ExecutorService执行Callable类型的任务,并将结果保存在future变量中
                        Future<String> future = executorService.submit(new TaskWithResult(i)); 
                         //将任务执行结果存储到List中
                        resultList.add(future); 
                 }
                 //遍历任务的结果
                for (Future<String> fs : resultList) { 
                         try { 
                                 System.out.println(fs.get());      //打印各个线程(任务)执行的结果
                        } catch (InterruptedException e) { 
                                 e.printStackTrace(); 
                         } catch (ExecutionException e) { 
                                 e.printStackTrace(); 
                         } finally { 
                                 //启动一次顺序关闭,执行以前提交的任务,但不接受新任务。如果已经关闭,则调用没有其他作用。
                                executorService.shutdown(); 
                         } 
                 } 
         } 
 }

class TaskWithResult  implements Callable<String> { 
         private int id;
         public TaskWithResult(int id) { 
                 this.id = id; 
         }
         /** 
          * 任务的具体过程,一旦任务传给ExecutorService的submit方法,则该方法自动在一个线程上执行。 
         * 
          * @return 
          * @throws Exception 
          */
         public String call()  throws Exception { 
                 System.out.println("call()方法被自动调用,干活!!!             " + Thread.currentThread().getName()); 
                 //一个模拟耗时的操作
                for (int i = 999999; i > 0; i--) ; 
                 return"call()方法被自动调用,任务的结果是:" + id + "    " + Thread.currentThread().getName(); 
         } 
 }
call()方法被自动调用,干活!!!             pool-1-thread-1
call()方法被自动调用,干活!!!             pool-1-thread-2
call()方法被自动调用,干活!!!             pool-1-thread-3
call()方法被自动调用,干活!!!             pool-1-thread-5
call()方法被自动调用,干活!!!             pool-1-thread-4
call()方法被自动调用,干活!!!             pool-1-thread-7
call()方法被自动调用,干活!!!             pool-1-thread-4
call()方法被自动调用,干活!!!             pool-1-thread-8
call()方法被自动调用,干活!!!             pool-1-thread-3
call()方法被自动调用,干活!!!             pool-1-thread-6
call()方法被自动调用,任务的结果是:0    pool-1-thread-1
call()方法被自动调用,任务的结果是:1    pool-1-thread-2
call()方法被自动调用,任务的结果是:2    pool-1-thread-3
call()方法被自动调用,任务的结果是:3    pool-1-thread-4
call()方法被自动调用,任务的结果是:4    pool-1-thread-5
call()方法被自动调用,任务的结果是:5    pool-1-thread-6
call()方法被自动调用,任务的结果是:6    pool-1-thread-7
call()方法被自动调用,任务的结果是:7    pool-1-thread-8
call()方法被自动调用,任务的结果是:8    pool-1-thread-3
call()方法被自动调用,任务的结果是:9    pool-1-thread-4

参考文章:

submit与execute区别

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

Callable与Runable接口

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

 

 


本文出自 “一无所有-天行者” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1685978

Callable与Runable接口 submit与execute区别

标签:submit与execute callable与runable

原文地址:http://tianxingzhe.blog.51cto.com/3390077/1685978

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!