您的位置:首页 > 编程语言 > Java开发

java中Runnable与Callable区别

2013-12-11 16:43 232 查看
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 implementsRunnable {

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();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: