java中Runnable与Callable区别

     Runnable是执行工作的独立任务,但是不具有任何返回值。  Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为 run 的无参数方法。 设计该接口的目的是为希望在活动时执行代码的对象提供一个公共协议。例如,Thread 类实现了 Runnable。激活的意思是说某个线程已启动并且尚未停止。 此外, Runnable 为非 Thread 子类的类提供了一种激活方式。通过实例化某个 Thread 实例并将自身作为运行目标,就可以运行实现 Runnable 的类而无需创建 Thread 的子类。大多数情况下,如果只想重写 run() 方法,而不重写其他 Thread 方法,那么应使用 Runnable 接口。这很重要,因为除非程序员打算修改或增强类的基本行为,否则不应为该类创建子类。如果想定义任务,只需实现Runnable接口并编写run()方法。

      Callable是在需要任务完成时候返回一个值的时候使用,它是一个具有类型参数的泛型,它的类型参数表示的是从方法call()(而不是run())中返回的值,并且必须使用ExecutorService.submit()方法调用它,如下面所示:

   import java.util.*;
import java.util.concurrent.*;


class TaskWithResult implements Callable<String>{
  private int id;
  public TaskWithResult(int id){
    this.id=id;
  }
  public String call(){
    return "result of TaskWithResult "+id;
  }
}
public class CallableDemo {
  public static void main(String[] args){
    ExecutorService exec=Executors.newCachedThreadPool();
    ArrayList<Future<String>> results=new ArrayList<Future<String>>();
    for(int i=0;i<10;i++)
        results.add(exec.submit(new TaskWithResult(i)));
    for(Future<String> fs:results)
        try{
        System.out.println(fs.get());
        }catch(InterruptedException e){
        System.out.println(e);
        return;
        }catch(ExecutionException e){
        System.out.println(e);
        return;
        }finally{
        exec.shutdown();
        }
  }    

submit()方法会产生Future对象,它用Callable返回的接货的特定类型进行了参数化。并且可以调用isDone()查询Future是否已经完成,当任务完成时候,可以调用get()方法来获取结果。也可以不用isDone()就直接调用get(),这种情况下,get()将阻塞,直至结果准备就绪。你还可以在试图调用get()来获取结果钱,先调用具有超市的get(),或者调用isDone()来查看任务是否完成!下面是实现Runnable接口的示例

   import java.util.concurrent.*;


public class LiftOff implements Runnable {
    protected int countDown=10;
    private static int taskCount=0;
    private final int id=taskCount++;
    public LiftOff(){}
    public LiftOff(int countDown){
     this.countDown=countDown;
    }
    public String status(){
     return "#"+id+"("+(countDown>0 ?countDown:"LiftOff!")+"),";
    }
    public void run(){
      while(countDown-->0){
        System.out.print(status());
        Thread.yield();
      }
    }
    public static void main(String[] args){
      //LiftOff xuesong=new LiftOff();
      //xuesong.run();
        /*Thread t=new Thread(new LiftOff());
        t.start();
        System.out.println("Waiting for the LiftOff!!!");
        for(int i=0;i<5;i++)
            new Thread(new LiftOff()).start();
        System.out.println("Waiting for LiftOff!!!!!!!!");*/
        //ExecutorService exec=Executors.newCachedThreadPool();
        //ExecutorService exec =Executors.newFixedThreadPool(5);
        ExecutorService exec=Executors.newSingleThreadExecutor();
        for(int i=0;i<5;i++)
            exec.execute(new LiftOff());
        exec.shutdown();
    }
    
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值