Runnable和Callable有什么区别?

主要区别

  • Runnable 接口 run 方法无返回值;Callable 接口 call 方法有返回值,支持泛型
  • Runnable 接口 run 方法只能抛出运行时异常,且无法捕获处理;Callable 接口 call 方法允许抛出异常,可以获取异常信息

测试代码

import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.FutureTask; public class TestRunnableAndCallable { public static void main(String[] args) {testImplementsRunable();testImplementsCallable();testImplementsCallableWithException();}//测试实现Runnable接口的方式创建、启动线程public static void testImplementsRunable() {Thread t1 = new Thread(new CustomRunnable());t1.setName("CustomRunnable");t1.start();}//测试实现Callable接口的方式创建、启动线程public static void testImplementsCallable() {Callable<String> callable = new CustomCallable();FutureTask<String> futureTask = new FutureTask<String>(callable);Thread t2 = new Thread(futureTask);t2.setName("CustomCallable");t2.start();try {System.out.println(futureTask.get());} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}//测试实现Callable接口的方式创建、启动线程,抛出异常public static void testImplementsCallableWithException() {Callable<String> callable = new CustomCallable2();FutureTask<String> futureTask = new FutureTask<String>(callable);Thread t3 = new Thread(futureTask);t3.setName("CustomCallableWithException");t3.start();try {System.out.println(futureTask.get());} catch (InterruptedException e) {e.printStackTrace();} catch (ExecutionException e) {e.printStackTrace();}}} //实现Runnable接口,重写run方法class CustomRunnable implements Runnable { public void run() {System.out.println(Thread.currentThread().getName());//throw new RuntimeException("aaa");}} //实现Callable接口,重写call方法class CustomCallable implements Callable<String> { public String call() throws Exception {System.out.println(Thread.currentThread().getName());return "Callable Result";}} //实现Callable接口,重写call方法无法计算抛出异常class CustomCallable2 implements Callable<String> { public String call() throws Exception {System.out.println(Thread.currentThread().getName());throw new Exception("I can compute a result");}}

打印结果

CustomRunnableCustomCallableCallable ResultCustomCallableWithExceptionjava.util.concurrent.ExecutionException: java.lang.Exception: I can compute a resultat java.util.concurrent.FutureTask.report(FutureTask.java:122)at java.util.concurrent.FutureTask.get(FutureTask.java:192)at constxiong.interview.TestRunnableAndCallable.testImplementsCallableWithException(TestRunnableAndCallable.java:46)at constxiong.interview.TestRunnableAndCallable.main(TestRunnableAndCallable.java:12)Caused by: java.lang.Exception: I can compute a resultat constxiong.interview.CustomCallable2.call(TestRunnableAndCallable.java:81)at constxiong.interview.CustomCallable2.call(TestRunnableAndCallable.java:1)at java.util.concurrent.FutureTask.run(FutureTask.java:266)at java.lang.Thread.run(Thread.java:748)

给TA打赏
共{{data.count}}人
人已打赏
Java

2020-7-31 0:46:40

Java

notify()和notifyAll()有什么区别?

2020-7-31 0:50:00

本站所发布的一切源码、模板、应用等文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权。本站内容适用于DMCA政策。若您的权利被侵害,请与我们联系处理,站长 QQ: 84087680 或 点击右侧 私信:盾给网 反馈,我们将尽快处理。
⚠️
本站所发布的一切源码、模板、应用等文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权。本站内容适用于DMCA政策
若您的权利被侵害,请与我们联系处理,站长 QQ: 84087680 或 点击右侧 私信:盾给网 反馈,我们将尽快处理。
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索