callable结合FutureTask的多线程使用(免打扰模式)
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
*
* @author Kaiwii Ho
* Callable类就是一个有返回值的任务
* 对于任务与Thread之间的关系,可以这样子理解:
* Callable类的实例就是一个锦囊妙计;而Thread就是执行这个锦囊妙计的过程
*
* FutureTask类(Future接口的一个实现)就是一个监视器:检测着被若干个异步线程操作的变量的一个类
*
* 代码演示了主线程如何通过使用Callable类和FutureTask类,实现:
* 主线程一边等待子线程的处理结果,一边完成自己的工作。
*
*考虑以下一个小黑工kaiwii的故事……
*/
public class TestFutureTask {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//准备一份工作给一个打工仔employee叫Kaiwii
Employee kaiwii=new Employee("kaiwii");
//新建一个监工头inspector
FutureTask<Double>inspector=new FutureTask<Double>(kaiwii);
//让kaiwii这个打工仔工作
System.out.println("老板发话,让kaiwii这个打工仔工作吧!");
new Thread(inspector).start();
System.out.println("老板开始数钱!");
//老板一边数钱,一边命令监工inspector监视Kaiwii工作;一旦kaiwii完成工作就拿来让他检查
while(!inspector.isDone()){
System.out.println("老板数钱中……");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//老板交监工inspector将kaiwii的结果呈上来以便他验收kaiwii计算出来的结果
try {
System.out.println("老板发现kaiwii的结果是:"+inspector.get());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//子线程
class Employee implements Callable<Double>{
String employee_name;
private void setEmployee_name(String employee_name) {
this.employee_name = employee_name;
}
public Employee(String employee_name) {
setEmployee_name(employee_name);
}
@Override
public Double call() throws Exception {
// TODO Auto-generated method stub
System.out.println("工人"+employee_name+"说:我开始工作了!!!!");
for(int i=1;i<=10;i++){
System.out.println("工人"+employee_name+" 第"+i+"次说:我在工作呢!!!!");
Thread.sleep(1000);
}
System.out.println("工人"+employee_name+"说:我搞好了!!!!");
return Math.random();
}
}
console显示结果:
老板发话,让kaiwii这个打工仔工作吧!
老板开始数钱!
工人kaiwii说:我开始工作了!!!!
工人kaiwii 第1次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第2次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
老板数钱中……
工人kaiwii 第3次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第4次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第5次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第6次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第7次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第8次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第9次说:我在工作呢!!!!
老板数钱中……
老板数钱中……
工人kaiwii 第10次说:我在工作呢!!!!
老板数钱中……
工人kaiwii说:我搞好了!!!!
老板数钱中……
老板发现kaiwii的结果是:0.5295364482450889
callable结合FutureTask的多线程使用(免打扰模式)的更多相关文章
- 超赞!IDEA 最新版本,支持免打扰和轻量模式!
IntelliJ IDEA 2020.1 的第二个早期访问版本已发布,新的 EAP 构建对调试器和事件探查器(Profiler)进行了改进,并引入了新的提交工具窗口(Commit toolwindow ...
- 基于接口回调详解JUC中Callable和FutureTask实现原理
Callable接口和FutureTask实现类,是JUC(Java Util Concurrent)包中很重要的两个技术实现,它们使获取多线程运行结果成为可能.它们底层的实现,就是基于接口回调技术. ...
- java Runnable、Callable、FutureTask 和线程池
一:Runnable.Callable.FutureTask简介 (1)Runnable:其中的run()方法没有返回值. ①.Runnable对象可以直接扔给Thread创建线程实例,并且创建的线程 ...
- Java 并发编程——Callable+Future+FutureTask
Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...
- 12 Callable & Future & FutureTask
创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果. 如果需要获取执行结果,就必须通过共享变量或者使用 ...
- Java多线程编程中Future模式的详解
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
- Java多线程编程中Future模式的详解<转>
Java多线程编程中,常用的多线程设计模式包括:Future模式.Master-Worker模式.Guarded Suspeionsion模式.不变模式和生产者-消费者模式等.这篇文章主要讲述Futu ...
- 【多线程】--生产者消费者模式--Lock版本
在JDK1.5发布后,提供了Synchronized的更优解决方案:Lock 和 Condition 我们使用这些新知识,来改进例子:[多线程]--生产者消费者模式--Synchronized版本 改 ...
- java多线程-消费者和生产者模式
/* * 多线程-消费者和生产者模式 * 在实现消费者生产者模式的时候必须要具备两个前提,一是,必须访问的是一个共享资源,二是必须要有线程锁,且锁的是同一个对象 * */ /*资源类中定义了name( ...
- Java多线程_生产者消费者模式2
在我的上一条博客中,已经介绍到了多线程的经典案列——生产者消费者模式,但是在上篇中用的是传统的麻烦的非阻塞队列实现的.在这篇博客中我将介绍另一种方式就是:用阻塞队列完成生产者消费者模式,可以使用多种阻 ...
随机推荐
- android 播放视频页面黑屏,且报错:Couldn't open 'xxxxxx' java.io.FileNotFoundException: No content provider:
原因为,activity的顶部布局,VideoView设定了android:background="@color/bg_black"去掉就可以了 之前跑着都正常,改了UI后就没有去 ...
- Maven 项目 有Dependencies, 使用时无法引用,爆红
1. 找到本地的该依赖的文件夹,将里面的.lastUpdated文件删除 2. IDEA清缓存重启
- 【YashanDB知识库】表收集统计信息默认阈值引起SQL执行效率差
[问题分类]性能优化 [关键字]统计信息,阈值,执行计划 [问题描述]表新增87w数据自动收集统计信息任务没有启动导致SQL执行计划变差 [问题原因分析] CUS_REGISTER_READ 数据总量 ...
- 最小化安装killall不可用
最小化安装killall不可用 最小化安装Centos7.4后,发现killall命令不可用 使用了以下命令,查看软件包名: yum search killall 查找后发现应使用这个安装包 yum ...
- 爬虫案例2-爬取视频的三种方式之一:selenium篇(2)
@ 目录 前言 selenium简介 实战案例 共勉 博客 前言 继使用requests库爬取好看视频的文章后,本文分享使用python第三方库selenium库接着来爬取视频网站,后续也会接着分享使 ...
- SQL Server Aggregate Functions
SUM 如果 row count = 0 返回的是 NULL 而不是 0 哦, 如果要 0 可以使用 ISNULL 来处理 如果其中一些 row 是 NULL, 那无所谓, 它只会 SUM 数字出来 ...
- .Net 反射和特性
学习:.net 反射简单介绍 - WebEnh - 博客园 (cnblogs.com) 反射就是通过反射程序集从而获取相关信息 十月的韩流 使用了特性就必定会使用反射 var res = obj.Ge ...
- 2. 王道OS-操作系统的特征,发展和分类
1. 并发:宏观上是同时发生的,微观是交替发生的 :ps:并行:宏观和微观都是同时发生的 : ps:单核CPU同一时刻只能执行一个程序,各个程序只能并发的执行 : 多核CPU同一时刻可以同时执行多个程 ...
- 我在大厂做 CR——为什么建议使用枚举来替换布尔值
使用枚举替换布尔值主要基于以下几个原因 ● 可读性 ● 可拓展性 ● 安全防控 可读性 我们会定义 boolean 类型(true 或 false)作为方法参数,虽然比较简洁,但有时候参数的含义往往不 ...
- 工作中的技术总结_ form表单使用注意事项之form触发后台提交事件 _20220127
工作中的技术总结_ form表单使用注意事项之form触发后台提交事件 _20220127 如无必要不要使用 form标签 来作为组件的父节点 事件过程: 项目使用的是 spring + jsp 的框 ...