• runnable & callable


    简介

    简单来说这两个接口都是执行多线程里面使用的东西.

    参考链接

    https://blog.csdn.net/qq_41357573/article/details/88887566

    区别

    Java多线程有两个重要的接口,Runnable和Callable,分别提供了一个call方法和一个run方法

    相同点

    两者都是接口
    两者都可以用来编写多线程程序
    两者都可以调用Thread.start()来启动线程

    不同点

    两个最大的不同点就是:

    能否返回结果

    实现Callable接口的线程能够返回结果;
    而实现Runnable接口的线程不能返回结果

    能否抛出异常

    Callable接口的call()方法允许抛出异常;
    而Runnable接口的run方法的异常只能在内部消化,不能继续上抛。

    Runnable可以作为Thread构造器的参数,通过开启新的线程来执行,也可以通过线程池来执行;而Callable只能通过线程池来执行。

    Futrue & FutureTask

    FutureTask可以用于闭锁,它实现了Future接口,表示一种可抽象的可产成结果的计算。
    Future就是对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果。必要时可以通过get方法获取结果,该方法会阻塞直到任务返回结果。

    简单来说, Future 就是对于Runnable 和 Callable 进行了封装. 他可以查询线程是否执行完毕, 与执行结果等等.

    code

    /**
     * Created by lee on 2021/6/4.
     */
    
    
    import java.util.concurrent.Callable;
    import java.util.concurrent.ExecutionException;
    import java.util.concurrent.Future;
    import java.util.concurrent.FutureTask;
    
    /**
     * 测试Callable
     *
     * @author qiang
     *
     */
    public class SolutionX implements Callable<String> {
        private String arg;
    
        public SolutionX(String arg) {
            this.arg = arg;
        }
    
        public String call() throws Exception {
            // 线程阻塞1秒,会返回这个异常
            Thread.sleep(1000);
    
            return this.arg + " append some chars and return it!";
        }
    
        public static void main(String[] args) throws InterruptedException, ExecutionException {
    
            Callable<String> callable = new SolutionX("world");
            Future<String> futuretask = new FutureTask<>(callable);
            Long beginTime = System.currentTimeMillis();
    
            // 创键线程
            new Thread((Runnable) futuretask).start();// Thread只接受Runnable类型的参数
            // get方法会阻塞线程,反之返回结果
            String result = futuretask.get();
            long endTime = System.currentTimeMillis();
    
            System.out.println("hello " + result);
            System.out.println("cast :" + (endTime - beginTime) / 1000 + "second");
        }
    }
    
    Hope is a good thing,maybe the best of things,and no good thing ever dies.----------- Andy Dufresne
  • 相关阅读:
    GridView自定义分页
    intro
    ListView和DataPager初试
    在DataGrid中,如何录入数量及单价的时候自动算出金额
    常用正则表达式
    ASP.NET中基类页的设计和使用
    Asp.net实现无刷新检测用户名
    在asp.net2.0中使用存储过程
    .NET中的抽象工厂
    用C#生成随机中文汉字验证码的基本原理 [转]
  • 原文地址:https://www.cnblogs.com/eat-too-much/p/14850012.html
Copyright © 2020-2023  润新知