版权声明:版权所有,翻版我也没办法!!! https://blog.csdn.net/tebtebtebteb/article/details/82934400
我们知道实现Runnable和实现Callable均可创建线程,那么他们有什么区别呢?
Runnable和Callable的区别
Runnable接口
public interface Runnable {
void run();
}
Callable接口
public interface Callable<V> {
V call() throws Exception;
}
总结:
- Runnable执行方法是run(),Callable是call()
- 实现Runnable接口的任务线程无返回值;实现Callable接口的任务线程能返回执行结果
- call方法可以抛出异常,run方法若有异常只能在内部消化
Callable示例
public class CallableDemo {
public static void main(String[] args) {
//创建一个定长的核心线程和最大线程数都是1的FixedThreadPool线程池
ExecutorService executorService = Executors.newFixedThreadPool(2);
Callable<String> callable = new Callable<String>() {
@Override
public String call() throws Exception {
Thread.sleep(3000);
System.out.println("Thread_current="+Thread.currentThread());
return "Hello world";
}
};
System.out.println("start");
// 执行任务并获取Future对象
Future<String> future = executorService.submit(callable);
try{
//future.get()线程结果,会阻塞当前线程直到线程结束
System.out.println("future.get()="+future.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
System.out.println("end");
// 关闭线程池
executorService.shutdown();
}
}