【Callable】接口与【Runnable】接口的比较

首先,RunnableCallable都是接口=。=

Callable接口和Runnable接口的区别就是:

Callable接口需要实现call方法,Runnable接口需要实现run方法;与此同时call方法还可以返回任何对象(因为在Callable接口中可以使用泛型),若不指定,JVM都会当作Object对象来处理,这样在代码中需要相应的类型转换。若指定了泛型的类型,则就不需要了=。=


Callable接口和Runnable接口的不同点有:
①.Runnable是自从java1.1就有了,而Callable是1.5之后才加上去的
②.Callable可以返回一个泛型类型V,而Runnable不能做到
③.Callable和Runnable都可以和Executors类(见下边)使用。然而Thread类只能使用Runnable
④.Callable可以抛出checked exception,而Runnable没有

 

用Executors来构建线程池步骤:

1).可以调用Executors类中的静态方法newCachedThreadPool(必要时创建新线程,空闲线程会被保留60秒)来创建线程池

也可以调用newFixedThreadPool方法创建固定数量的线程池等,

返回一个实现了ExecutorService接口的ThreadPoolExecutor类或者是一个实现了ScheduledExecutorServiece接口的类对象。

2).调用submit方法或者execute方法提交Runnable或Callable对象,返回一个Future(见下边)接口

3).当不再需要线程池时,可以通过shutdown方法销毁

 

Future接口:

常用与提取Callable执行的状态。

主要方法有:

①get(),获得Callable的返回值

②cancel(),取消Callable的执行

③isDone(),判断是否已经完成

④isCanceled(),判断是否已经取消


列举两个例子:

一:实现Runnable接口例子

public class Demo1 {

    public static void main(String[] args) {

        //创建含有5个线程的线程池
        ExecutorService pool = Executors.newFixedThreadPool(5);
        
        //可以通过execute方法或者submit方法来提交任务
        pool.execute(new Task1());
        pool.submit(new Task2());
        
        //销毁
        pool.shutdown();
    }
}

//实现Runnable接口
class Task1 implements Runnable{

    @Override
    public void run() {
        //业务逻辑略
        System.out.println("Runnable-----Task1");
    }
}

class Task2 implements Runnable{

    @Override
    public void run() {
        //业务逻辑略
        System.out.println("Runnable-----Task2");
    }
}

二:实现Callable接口例子

public class Demo2 {

    public static void main(String[] args) {

        ExecutorService e=Executors.newFixedThreadPool(5);
        //调用submit方法提交任务
        //用Future接口接收
        Future f1=e.submit(new MyCallable());
        Future f2=e.submit(new MyCallable());

        try {
            //通过get方法来获取call返回的值
            System.out.println(f1.get());
            System.out.println(f2.get());
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        } catch (ExecutionException e1) {
            e1.printStackTrace();
        }

        //销毁
        e.shutdown();

    }
}

class MyCallable implements Callable<String>{

    @Override
    public String call() throws Exception {
        //简单的返回一个字符串
        return "aaaaa";
    }
}

会很容易的发现,在实现Runnable接口的run方法中没有返回值,而实现Callable接口的call方法中又返回值而且可以通过get方法获取到
 

若有不正之处请多多谅解,并欢迎批评指正。


版权声明:本文为k_kuo_k原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。