首页 > 作文

java面试常问的Runnable和Callable的区别

更新时间:2023-04-04 13:53:59 阅读: 评论:0

runnable

runnable接口非常简单,就定义了一个方法run(), 实现runnable接口的run方法就可以实现多线程

// 函数式接口@functionalinterfacepublic interface runnable {    public abstract void run();}

callable

可能很多人都知道要想在多线程中获取异步返回值结果一般是用callable和futuretask接口来实现,但可能很多人都不知道其实callable是依赖于runnable的run方法进行执行任怎么查自己的学籍号务的,然后在通过futuretask来收集返回值结果,下面咱们就自己模拟写一份futuretask代码来看看是怎么实现的吧。

 /** * @author yinfeng * @description  自己实现futuretask,基于park/unpark进行线程通讯 * @since 2022/1/9 21:32 */public class myfuturetask<t> implements runnable {     callable<t> callable;    /**     * callable执行结果     */    t result;    /**     * task执行状态     */    string state = "new";    /**     * 存储正在等待的消费者     */    linkedblockingqueue<thread> waiters = new linkedblockingqueue<>();    public myfuturetask(callable<t> callable) {        this.callable = callable;    }    @override    public void run() {        try {            result = callable.call();        } catch (exception e) {            e.printstacktrace();        } finally {            state = "end中药全身美白";        }        // 任务执行完成后通过unpark通知消费者        system.out.println(thread.currentthread().getname() + " 生产者执行结束,通知消费者");        while (true) {            thread waiter = waiters.poll();            if (waiter == null) {                break;            }            locksupport.unpark(waiter);        }    }    /**     * park / unpark     */    public t get() throws exception {        thread mainthread = thread.currentthread();        // 塞入等待的集合中        waiters.a学习之神dd(mainthread);         // 判断状态        system.out.println(thread.currentthread().getname() + " 消费者进入等待");        while (!"end".equals(state)) {        // 阻塞等待任务执行完成后通知            locksupport.park(mainthread);        }        return result;    }}
我们写个demo测试一下
/** * @author yinfeng * @description * @since 2022/1/9 21:32 */public class futuretasktest {    public static void main(string[] args) throws exception {        final myfuturetask<string> futuretask = new myfuturetask<>(() -> {            thread.sleep(5000);            return "任务完成888";        });        new thread(futuretask).start();        final string result = futuretask.get();        system培正.out.println("结果:"+result);        // 控制台打印如下:         // main 消费者进入等待// thread-0 生产者执行结束,通知消费者// 结果:任务完成888    }}
可以看到我们的demo也是正常运行的,所以很关键的一点还是callable是依赖于runnable的run方法进行执行任务的

到此这篇关于java面试常问的runnable和callable的区别的文章就介绍到这了,更多相关java runnable和callable区别内容请搜索www.887551.com中国新歌声六强名单以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

本文发布于:2023-04-04 13:53:57,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/c621690e030c52469ddd1a7767dde72a.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:java面试常问的Runnable和Callable的区别.doc

本文 PDF 下载地址:java面试常问的Runnable和Callable的区别.pdf

下一篇:返回列表
标签:消费者   接口   通知   方法
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图