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