zoukankan      html  css  js  c++  java
  • 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");
        }
        
    }

    打印结果

    CustomRunnable
    CustomCallable
    Callable Result
    CustomCallableWithException
    java.util.concurrent.ExecutionException: java.lang.Exception: I can compute a result
    	at 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 result
    	at 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)


    原文链接
     


     

    所有资源资源汇总于公众号



     

  • 相关阅读:
    集合介绍,创建,添加,删除。
    字典简介、操作、内置函数、练习题
    git教程——简单总结
    前端性能优化总结
    小米2018春招实习笔试题总结
    浏览器缓存控制 以及 在url框中回车、F5 和 Ctrl + F5的区别
    携程2018春招实习前端开发笔试题分享
    不同方式实现两列布局
    移动端开发-viewport与媒体查询
    华为2018春招前端开发实习生笔试题分享
  • 原文地址:https://www.cnblogs.com/ConstXiong/p/12009131.html
Copyright © 2011-2022 走看看