Runnable

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

// 函数式接口
@FunctionalInterface
public 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;}@Overridepublic 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.add(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方法进行执行任务的

剑指offer之Runnable和Callable的区别相关推荐

  1. 《剑指offer》内容总结

    (1)剑指Offer--Trie树(字典树) Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是统计和排序大量的字符串(但不仅限于字符串),所以经常 ...

  2. 剑指Offer——迅雷笔试题+知识点总结

    剑指Offer--迅雷笔试题+知识点总结 情景回顾 时间:2016.9.19 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:迅雷笔试 总体来说,迅雷笔试内容体量不算多,主要 ...

  3. 【剑指offer】顺时针打印矩阵

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/26053049 剑指offer上的第20题,九度OJ上測试通过. 题目描写叙述: 输入一个矩 ...

  4. 剑指offer第二版答案详细版(带详细解题思路)

    1.滑动窗口的最大值(剑指offer原59题) 解题思路:其实是一个队列的问题,用一个队列去维护当前窗口中的所有元素:首先将超出窗口中的队头元素先删掉,然后将新的元素插入当前窗口中,插入时要判断新插入 ...

  5. 【每日一题】剑指 Offer 10- I. 斐波那契数列

    剑指 Offer 10- I. 斐波那契数列

  6. 【每日一题】剑指 Offer 22. 链表中倒数第k个节点

    剑指 Offer 22. 链表中倒数第k个节点

  7. 递增的整数序列链表的插入_每日算法题 | 剑指offer 链表专题 (5)链表中倒数第k个节点...

    点击上方"Jerry的算法和NLP",选择"星标"公众号 重磅干货,第一时间送达 题目 链表中倒数第k个节点 题目要求 输入一个链表的头结点,从尾到头反过来打印 ...

  8. 《剑指offer》写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。...

    弱菜刷题还是刷中文题好了,没必要和英文过不去,现在的重点是基本代码能力的恢复. [题目] 剑指offer 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. [思路] 直觉 ...

  9. 剑指offer:翻转单词顺序列

    题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,"st ...

最新文章

  1. Buffer的工作方式
  2. 【记录一个问题】cuda核函数可能存在栈溢出,导致main()函数退出后程序卡死30秒CUDA...
  3. Java使用jmeter源码进行接口测试_jmeter用java代码怎样编写接口测试源码
  4. 项目背景介绍及文件系统基本概念简介
  5. Windows下删除.svn文件夹的简易方法
  6. android handler同步,android解决:使用多线程和Handler同步更新UI
  7. linux内存利用率多少合适,如何理解linux服务器中的内存使用率和平均负载
  8. (三)、dubbo环境的搭建
  9. 似然函数(likelihood function)
  10. spring boot 拦截器 或 Spring AOP 方式记录请求日志
  11. intellij idea设置代码提示不区分大小写
  12. Java笔记(2)黑马刘意_Java入门_2019_idea版
  13. 孙鑫老师的帮助文档 MSDN Library 2001January 下载地址
  14. 目标管理 - SMART原则
  15. qq视频转码失败怎么办_教程:如何下载舞蹈视频里面的音乐?
  16. macOS pages 插入公式快捷键
  17. 【LWIP】(补充)STM32H743(M7内核)CubeMX配置LWIP并ping通
  18. 外包php技术,php外包
  19. http+flv+java,HTTP-FLV的两种方式
  20. PTA---计算天数

热门文章

  1. 打过工、留过洋、创过业,一位中年IT老兵的反思
  2. 深圳市南山区派出所大全
  3. PyQt5+PIL模块实现图片批量处理器
  4. python爬虫实战(2)——爬取知乎热榜内容
  5. 都市男女的32声叹息
  6. 与mysql数据库的交互实战_基于 Go 语言开发在线论坛(二):通过模型类与MySQL数据库交互...
  7. script地下状态栏效果
  8. 中兴通讯推出全球首款Wi-Fi 7标准5G CPE
  9. 上海市消保委:春节长假期间 共受理消费者投诉4600件
  10. 京东企业租赁11.11:新用户数环比增长786% 订单量环比增长519%