zoukankan      html  css  js  c++  java
  • Runnable和Callable之间的区别

    Runnable和Callable之间的区别

    1、Runnable任务执行后没有返回值;Callable任务执行后可以获得返回值

    2、Runnable的方法是run(),没有返回值;Callable的方法是call(),有返回值

    3、Runnable的run()方法不能抛异常,有异常的话只能在run方法里面解决;Callable的call()方法可以抛异常

    4、Runnable可以直接传递给Thread对象执行;Callable不可以,Callable执行可以放在FutureTask中,然后把futureTask传递给Thread执行

    这里只关注了异常的捕捉:

    package com.qjc.thread.runandcall;
    
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.FutureTask;
    
    public class RunnableAndCallable {
    
        public static void main(String[] args) {
            // Runnable可以直接传递给Thread对象执行
            new Thread(new RunnableThread()).start();
            // 查看FutureTask源码最终集继承是Runnable, Future<V>接口,所以可通过Excutor(线程池) 来执行,也可传递给Thread对象执行。
            FutureTask<String> futureTask = new FutureTask<>(new CallableThread());
            new Thread(futureTask).start();
            String string = null;
            try {
                string = futureTask.get();
            } catch (InterruptedException e) {
                string = "InterruptedException";
                e.printStackTrace();
            } catch (ExecutionException e) {
                string = "ExecutionException";
                e.printStackTrace();
            }
            System.out.println("CallableThread输出:" + string);
        }
    }
    
    class RunnableThread implements Runnable {
        @Override
        public void run() {
            int a = 0;
            try {
                a = 100 / 0;
                System.out.println("RunnableThread输出:" + a);
            } catch (Exception e) {
                System.err.println("RunnableThread出异常了");
                e.printStackTrace();
            }
        }
    }
    
    class CallableThread implements Callable<String> {
        @Override
        public String call() throws Exception {
            int a = 100 / 1;
            return String.valueOf(a);
        }
    }
  • 相关阅读:
    整型
    圆的面积和周长
    买菜
    keil 生成 bin 文件 gd32为例
    内存中 1k 代表什么
    正反转 步进电机 驱动器 编码器
    stlink 无法再keil中识别 按下复位键可以识别
    单片机的时钟,系统时钟
    db9串口接头的定义
    E面波导和H面波导的问题
  • 原文地址:https://www.cnblogs.com/java-spring/p/9646817.html
Copyright © 2011-2022 走看看