Runnable
和 Callable
都是 Java 中用于多线程编程的接口,它们的主要区别在于是否返回结果和是否抛出异常。
Runnable
java.lang.Runnable
接口是一个函数式接口,它代表一个可以在单独的线程中运行的任务。它只有一个方法 run()
,用于定义要执行的任务逻辑。
public interface Runnable {
public abstract void run();
}
通常情况下,你需要实现 run()
方法,并在其中编写你想要在线程中执行的代码。
Callable
java.util.concurrent.Callable
接口也是一个函数式接口,它代表了一个可以在单独的线程中运行的任务,但与 Runnable
不同,Callable
的 call()
方法可以返回一个结果或抛出异常。
public interface Callable<V> {
V call() throws Exception;
}
call()
方法可以抛出异常,这是因为它声明了可能会抛出异常,所以你必须在实现时处理这些异常。
主要区别
-
返回值:
Runnable
的run()
方法没有返回值,因此通常用于执行没有返回结果的操作。Callable
的call()
方法可以返回一个结果。
-
异常处理:
run()
方法不能抛出已检查的异常,但可以捕获并处理异常。call()
方法可以抛出异常,但必须声明可能抛出的异常类型。
-
返回结果:
Callable
可以返回一个结果,通常是一个泛型类型。Runnable
不返回任何结果。
-
用法:
Runnable
通常用于执行一些耗时操作或异步任务,例如网络请求、文件读写等。Callable
通常用于需要返回结果的任务,比如计算某个数学公式的结果。
-
线程池:
Executor
框架中的submit(Callable)
方法可以提交一个Callable
任务,返回一个Future
对象,可以用来获取任务的执行结果。
ExecutorService executor = Executors.newFixedThreadPool(1);
Future<String> future = executor.submit(new Callable<String>() {
@Override
public String call() throws Exception {
return "Hello from Callable!";
}
});
String result = future.get(); // 获取结果
总的来说,如果你只是需要在一个新线程中执行一些操作而不需要返回结果,可以使用 Runnable
接口。如果你需要返回结果或者要抛出受检异常,那么就应该使用 Callable
接口。