JAVA基础复习与总结<十> Ruannable和Callable
程序运行原理
1、分时调度:所有线程轮流使用CPU的使用权,平均分配给每个线程占用CPU的时间。
2、抢占式调度:优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度。
实际上,CPU使用抢占式调度模式在多个线程之间进行高速切换。对于CPU的一个核而言,某个时刻只能执行一个线程,但是CPU在多个线程之间的切换速度相对我们的感受来说很快,看上去就是在同一时刻运行。
实际上多线程程序并不能提高程序的运行速度,但是能够提高程序的运行效率,让CPU的使用率更高。
线程安全:如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。程序每次运行结果和单线程运行结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
Runnable和Callable
上篇博客已经介绍了如何继承Thread来实现多线程。但是实际上直接继承Thread类有一个很大的缺点,因为java类只能单继承。当前类继承了Thread类之后就不能在继承其他类类。
通过另外两种方法:Runnable和Callable我们可以改进这个问题。
Runnable接口
java提供了接口java.lang.Runnable来解决问题。Runnable避免单继承的局限性,便于共享资源,多个Thread可以同时加载一个Runnable。当各自Thread获得CPU时间片的时候开始运行Runnable,Runnable里面的资源是被共享的。
使用Ruannble创建线程的过程:
静态代理有如下要素:
1.目标角色(真实角色)
2.代理角色
3.目标角色和代理角色实现同一接口(比如Thread作为代理角色,其接口就是Runabble)
4.代理角色持有目标角色的引用
/**
* 推荐使用Runnable创建线程
* 1)避免单继承的局限性
* 2)便于共享资源
* 使用Runnable创建线程
* 1、类实现Runnable接口 + 重写 run()方法 ---->真实角色类
* 2、启动多线程使用静态代理
* 1)创建真实角色
* 2)创建代理角色 + 真实角色的引用
* 3)调用.start方法
*/
public class Programmar implements Runnable{
public void run(){
for(int i =0;i<1000;i++){
System.out.println("一边敲代码....");
}
}
}
public class ProgrammarApp {
public static void main(String[]args){
// 1)创建真实角色
Programmar pro = new Programmar();
// 2)创建代理角色 + 真实角色的引用
Thread proxy = new Thread(pro);
// 3)调用.start方法
proxy.start();
//上面的start是一条路径,下面的for循环又是一条路径
for(int i =0;i<1000;i++){
System.out.println("一边聊QQ....");
}
}
}
Callable接口
Runnable是执行工作的独立任务,但是它不返回任何值。如果希望任务在完成的时候能够返回一个具体的值,那么可以选择实现Callable接口而不是Runnable接口。它的参数类型表示的是从方法call()而不是run()中返回值。
/**
*使用Callable创建线程
*/
public class Call {
public static void main(String[] args)throws InterruptedException,ExecutionException{
//创建线程
ExecutorService ser = Executors.newFixedThreadPool(1);
Race tor = new Race("乌龟",1000);
Race rab = new Race("兔子",100);
//获取值
Future<Integer> result1 = ser.submit(tor);
Future<Integer> result2 = ser.submit(rab);
Thread.sleep(2000);//就跑两秒
tor.setFlag(false);
rab.setFlag(false); //停止线程体循环
int num1 = result1.get();
System.out.println("乌龟跑了---->" + num1);
int num2 = result2.get();
System.out.println("兔子跑了---->" + num2);
//停止服务
ser.shutdown();
}
}
class Race implements Callable<Integer>{ //后面<>里面的类型意为声明返回的是什么类型
private String name; //名称
private long time; //延时时间
private boolean flag = true;
private int step = 0; //步
public Race (){
}
public Race (String name){
super();
this.name = name;
}
public Race (String name,long time){
super();
this.name = name;
this.time = time;
}
public Integer call() throws Exception{
while (flag){
Thread.sleep(time); //延时
step++;
}
return step;
}
public void setName ( String name ) {
this.name = name;
}
public String getName () {
return this.name;
}
public int getStep () {
return this.step;
}
public void setStep ( int step ) {
this.step = step;
}
public long getTime () {
return this.time;
}
public void setTime ( int time ) {
this.time = time;
}
public void setFlag ( boolean flag ) {
this.flag = flag;
}
}
JAVA基础复习与总结<十> Ruannable和Callable的更多相关文章
- Java基础复习笔记系列 八 多线程编程
Java基础复习笔记系列之 多线程编程 参考地址: http://blog.csdn.net/xuweilinjijis/article/details/8878649 今天的故事,让我们从上面这个图 ...
- Java基础复习笔记系列 九 网络编程
Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...
- Java基础复习笔记系列 七 IO操作
Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...
- Java基础复习笔记系列 五 常用类
Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...
- Java基础复习笔记系列 四 数组
Java基础复习笔记系列之 数组 1.数组初步介绍? Java中的数组是引用类型,不可以直接分配在栈上.不同于C(在Java中,除了基础数据类型外,所有的类型都是引用类型.) Java中的数组在申明时 ...
- Java基础复习笔记基本排序算法
Java基础复习笔记基本排序算法 1. 排序 排序是一个历来都是很多算法家热衷的领域,到现在还有很多数学家兼计算机专家还在研究.而排序是计算机程序开发中常用的一种操作.为何需要排序呢.我们在所有的系统 ...
- 《Java基础复习》-控制执行流程
最近任务太多了,肝哭我了,boom 参考书目:Thinking in Java <Java基础复习>-控制执行流程 Java使用了C的所有流程控制语句 涉及关键字:if-else.whil ...
- 《Java基础复习》—常识与入门
突然发现自己Java基础的底子不到位,复习! 所记知识会发布在CSDN与博客网站jirath.cn <Java基础复习>-常识与入门 一.Java语言的知识体系图 分为三部分 编程语言核心 ...
- Java基础复习之数组
Java基础复习之:数组 简介 数组(Array):多个相同数据类型按照一定顺序排列的集合,并使用一个名字命名,通过编号的方式对这些数据进行统一管理 一维数组 一维数组的声明与初始化 int[] id ...
随机推荐
- python 基础部分重点复习整理2
把这里的题目争取刷一遍 博客记录 python的ORM框架peewee SQLAlchemy psycopg2 Django 在1 的基础上,重点突出自己以前没注意的,做到精而不杂!!! Python ...
- Swagger Edit 安装和使用教程
Swagger Edit介绍Swagger是专门用来管理接口一个工具.在开发过程中,接口一直是纷争的聚焦点,能有效管理接口(保存好记录.及时更新.方便查看.接口测试).会让整个项目开发效率提升很大. ...
- arcgis图层 GraphicsLayer与FeatureLayer
什么是图层 图层是用来在 ArcGIS 产品套件中显示地理数据集的机制.每个图层代表一种数据集(可以是地图服务.图形或是矢量数据),并指定该数据集是如何描绘使用一组属性的. 包含一个地图控件的每个应用 ...
- 域 搭建OU 组织单元
以这个界面开始操作: 在 baidu.com 右键---新建----组织单位----北京分公司 在 baidu.com 右键---新建----组织单位----北京分公司 在北京分公司 和南京分公司下面 ...
- .net aop 操作 切面应用 Castle.Windsor框架 spring 可根据接口 自动生成一个空的实现接口的类
通过unget 安装Castle.Windsor using Castle.DynamicProxy; using System; using System.Collections.Generic; ...
- Contest2163 - 2019-3-28 高一noip基础知识点 测试6 题解版
传送门 @dsfz201814 改题 T1:全锕,过 T2:全锕,过 T3:@dsfz201814 先用竖着放置的木块将它变成高度差最大为1的数列 然后对于任意相邻相等的两块,可以将它看成任意 例如, ...
- 安装AB编程软件提示安装失败时如何处理
前言:在安装Studio 5000.FT VIEW.Logxi Emulate等AB编程软件,有时会出现安装失败.在这里,根据自己在安装过程中出现的错误情形,介绍如何处理的方法. 方法步骤 1.在安装 ...
- 关于JDK1.7+中HashMap对红黑树场景的思考
背景 在1.7之前的版本,当数组元素较多(几百.几千,或者更多)的时候,在这种前提扩容,涉及全量元素的遍历和坐标的重新定位,这个耗时会比较长.这是之前存在的一个弊端吧.那么引入红黑树之后就解决了问题, ...
- 转:jsp与servlet的区别与联系
jsp与servlet的区别与联系 - gsyabc - 博客园https://www.cnblogs.com/sanyouge/p/7325656.html jsp和servlet的区别和联系:1. ...
- 2018-2019-1-20165221&20165225 《信息安全系统设计》实验五:通讯协议设计
2018-2019-1-20165221&20165225 <信息安全系统设计>-实验五:通讯协议设计 OpenSSL学习: 简介: OpenSSL是为网络通信提供安全及数据完整性 ...