callable和runnable区别

一个有返回,一个没有返回。。。

  1. 返回值
  • Runnable接口中的run方法没有返回值,其签名为public void run()
  • Callable接口的call方法可以返回一个值,并且可以抛出异常。其签名为public T call(),其中T是返回值的类型。
  1. 异常处理
  • Runnablerun方法中的异常必须被内部捕获和处理,因为它们无法通过Runnable接口传递出去。
  • Callablecall方法可以抛出异常,这些异常可以被Future对象捕获,并在调用get方法时重新抛出。
  1. Future对象
  • 当你将Runnable任务提交给ExecutorService时,你只能获得一个Future<?>对象,但它的get方法总是返回null
  • 当你将Callable任务提交给ExecutorService时,你获得的Future<T>对象可以返回call方法的结果。
  1. 用例
  • Runnable通常用于那些不需要返回结果的任务。
  • Callable适用于那些需要从任务中获取结果的情况。
  1. 泛型
  • Runnable不是泛型接口,因此它不支持类型安全的返回值。
  • Callable是一个泛型接口,允许你指定call方法返回值的类型。
  1. 线程池提交方法
  • 当使用ExecutorService时,你可以使用execute(Runnable)方法来提交Runnable任务,这个方法没有返回值。
  • 对于Callable任务,你可以使用submit(Callable<T>)方法提交,这个方法返回一个Future<T>对象,可以用来获取任务的结果。

下面是一个简单的示例,展示了如何使用RunnableCallable

// Runnable示例
class MyRunnable implements Runnable {
    public void run() {
        System.out.println("Runnable task is running.");
    }
}

// Callable示例
class MyCallable implements Callable<Integer> {
    public Integer call() {
        System.out.println("Callable task is running.");
        return 123; // 返回一个结果
    }
}

// 使用ExecutorService提交任务
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(new MyRunnable()); // 提交Runnable任务

Future<Integer> future = executor.submit(new MyCallable()); // 提交Callable任务
try {
    Integer result = future.get(); // 从Future对象获取Callable任务的结果
    System.out.println("Callable result: " + result);
} catch (InterruptedException | ExecutionException e) {
    e.printStackTrace();
}
executor.shutdown();


Comments

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注