Runnable和Callable都是Java中用于表示可以在线程中执行的任务的接口。它们之间有一些关键区别,以及各自的应用场景。
定义:
Runnable是一个函数式接口,它只有一个抽象方法run()。Runnable接口的类需要重写run()方法,并在其中定义线程要执行的代码。特点:
Runnable的run()方法没有返回值。run()方法不能抛出受检异常(checked exceptions)。应用场景:
示例代码:
public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("Running in a thread: " + Thread.currentThread().getName());
}
public static void main(String[] args) {
Thread thread = new Thread(new MyRunnable());
thread.start();
}
}
定义:
Callable也是一个函数式接口,但它有一个抽象方法call()。Callable接口的类需要重写call()方法,并在其中定义线程要执行的代码。call()方法可以返回一个结果,并且可以抛出异常。特点:
Callable的call()方法可以返回一个结果。call()方法可以抛出受检异常。应用场景:
示例代码:
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
System.out.println("Running in a thread: " + Thread.currentThread().getName());
return 42; // 返回结果
}
public static void main(String[] args) {
MyCallable callable = new MyCallable();
FutureTask<Integer> futureTask = new FutureTask<>(callable);
Thread thread = new Thread(futureTask);
thread.start();
try {
Integer result = futureTask.get(); // 获取任务结果
System.out.println("Result: " + result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}
在实际应用中,你可以根据任务的具体需求选择使用Runnable或Callable。如果需要获取任务的执行结果或处理异常,建议使用Callable。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。