`

Callable 与 Runnable 的区别

阅读更多

转自:http://blog.sina.com.cn/s/blog_4c2e288b01000ark.html

 

Callable 接口类似于 Runnable ,两者都是为那些其实例可能被另一个线程执行的类设计的。但是 Runnable 不会返回结果,并且无法抛出经过检查的异常。

 
用下面的例子说明他们彼此的实现的不同:
 
 类构造:
 public class RunnableClass implements Runnable{
 
   public void run(){
 
 
   }
 }
 public class CallableClass implements Callable{
    public V call() throws Exception{
 
       return V
    }
 
 }
 类调用:
 
 Thread runnable=new Thread(RunnableClass);
 runnable.start();
 
 Callable<int[]> callable=new callableClass();
 FutureTask<int[]> future=new FutureTask(int[])(callable);
 Thread t=new Thread(future);
 t.start();
 if(future.isDone()){
    int[] intValue=future.get();
 }
 代码说明:
 FutureTask 属于代理类 ,负责启动Callable对象,并且可以通过它来获得Callable 的返回信息。

 

再举一个例子,如下代码:

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 *  Runnable是执行工作的独立任务,但是它不返回任何值, 
 *  如果希望任务在完成时能够返回一个值,可以实现Callable接口
 */
public class PrimeThread {

    public static void main(String[] args) throws Exception {
        ExecutorService service = Executors.newCachedThreadPool();
        System.out.println("==" + service.submit(new TaskResult(66)).get().toString());
    }
}

class TaskResult implements Callable<String> {

    private int id;

    public TaskResult(int id) {
        this.id = id;
    }

    public String call() throws Exception {
        return "result of TaskWithResult " + id;
    }
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics