剑指offer之Runnable和Callable的区别
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的区别相关推荐
- 《剑指offer》内容总结
(1)剑指Offer--Trie树(字典树) Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是统计和排序大量的字符串(但不仅限于字符串),所以经常 ...
- 剑指Offer——迅雷笔试题+知识点总结
剑指Offer--迅雷笔试题+知识点总结 情景回顾 时间:2016.9.19 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:迅雷笔试 总体来说,迅雷笔试内容体量不算多,主要 ...
- 【剑指offer】顺时针打印矩阵
转载请注明出处:http://blog.csdn.net/ns_code/article/details/26053049 剑指offer上的第20题,九度OJ上測试通过. 题目描写叙述: 输入一个矩 ...
- 剑指offer第二版答案详细版(带详细解题思路)
1.滑动窗口的最大值(剑指offer原59题) 解题思路:其实是一个队列的问题,用一个队列去维护当前窗口中的所有元素:首先将超出窗口中的队头元素先删掉,然后将新的元素插入当前窗口中,插入时要判断新插入 ...
- 【每日一题】剑指 Offer 10- I. 斐波那契数列
剑指 Offer 10- I. 斐波那契数列
- 【每日一题】剑指 Offer 22. 链表中倒数第k个节点
剑指 Offer 22. 链表中倒数第k个节点
- 递增的整数序列链表的插入_每日算法题 | 剑指offer 链表专题 (5)链表中倒数第k个节点...
点击上方"Jerry的算法和NLP",选择"星标"公众号 重磅干货,第一时间送达 题目 链表中倒数第k个节点 题目要求 输入一个链表的头结点,从尾到头反过来打印 ...
- 《剑指offer》写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。...
弱菜刷题还是刷中文题好了,没必要和英文过不去,现在的重点是基本代码能力的恢复. [题目] 剑指offer 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. [思路] 直觉 ...
- 剑指offer:翻转单词顺序列
题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,"st ...
最新文章
- Buffer的工作方式
- 【记录一个问题】cuda核函数可能存在栈溢出,导致main()函数退出后程序卡死30秒CUDA...
- Java使用jmeter源码进行接口测试_jmeter用java代码怎样编写接口测试源码
- 项目背景介绍及文件系统基本概念简介
- Windows下删除.svn文件夹的简易方法
- android handler同步,android解决:使用多线程和Handler同步更新UI
- linux内存利用率多少合适,如何理解linux服务器中的内存使用率和平均负载
- (三)、dubbo环境的搭建
- 似然函数(likelihood function)
- spring boot 拦截器 或 Spring AOP 方式记录请求日志
- intellij idea设置代码提示不区分大小写
- Java笔记(2)黑马刘意_Java入门_2019_idea版
- 孙鑫老师的帮助文档 MSDN Library 2001January 下载地址
- 目标管理 - SMART原则
- qq视频转码失败怎么办_教程:如何下载舞蹈视频里面的音乐?
- macOS pages 插入公式快捷键
- 【LWIP】(补充)STM32H743(M7内核)CubeMX配置LWIP并ping通
- 外包php技术,php外包
- http+flv+java,HTTP-FLV的两种方式
- PTA---计算天数
热门文章
- 打过工、留过洋、创过业,一位中年IT老兵的反思
- 深圳市南山区派出所大全
- PyQt5+PIL模块实现图片批量处理器
- python爬虫实战(2)——爬取知乎热榜内容
- 都市男女的32声叹息
- 与mysql数据库的交互实战_基于 Go 语言开发在线论坛(二):通过模型类与MySQL数据库交互...
- script地下状态栏效果
- 中兴通讯推出全球首款Wi-Fi 7标准5G CPE
- 上海市消保委:春节长假期间 共受理消费者投诉4600件
- 京东企业租赁11.11:新用户数环比增长786% 订单量环比增长519%