JAVA基础复习与总结<十> Ruannable和Callable

时间:2023-02-22 18:32:45

程序运行原理 

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的更多相关文章

  1. Java基础复习笔记系列 八 多线程编程

    Java基础复习笔记系列之 多线程编程 参考地址: http://blog.csdn.net/xuweilinjijis/article/details/8878649 今天的故事,让我们从上面这个图 ...

  2. Java基础复习笔记系列 九 网络编程

    Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...

  3. Java基础复习笔记系列 七 IO操作

    Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...

  4. Java基础复习笔记系列 五 常用类

    Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...

  5. Java基础复习笔记系列 四 数组

    Java基础复习笔记系列之 数组 1.数组初步介绍? Java中的数组是引用类型,不可以直接分配在栈上.不同于C(在Java中,除了基础数据类型外,所有的类型都是引用类型.) Java中的数组在申明时 ...

  6. Java基础复习笔记基本排序算法

    Java基础复习笔记基本排序算法 1. 排序 排序是一个历来都是很多算法家热衷的领域,到现在还有很多数学家兼计算机专家还在研究.而排序是计算机程序开发中常用的一种操作.为何需要排序呢.我们在所有的系统 ...

  7. 《Java基础复习》-控制执行流程

    最近任务太多了,肝哭我了,boom 参考书目:Thinking in Java <Java基础复习>-控制执行流程 Java使用了C的所有流程控制语句 涉及关键字:if-else.whil ...

  8. 《Java基础复习》—常识与入门

    突然发现自己Java基础的底子不到位,复习! 所记知识会发布在CSDN与博客网站jirath.cn <Java基础复习>-常识与入门 一.Java语言的知识体系图 分为三部分 编程语言核心 ...

  9. Java基础复习之数组

    Java基础复习之:数组 简介 数组(Array):多个相同数据类型按照一定顺序排列的集合,并使用一个名字命名,通过编号的方式对这些数据进行统一管理 一维数组 一维数组的声明与初始化 int[] id ...

随机推荐

  1. SQLServer2008部署镜像

    SQL Server 2008 R2数据库镜像部署 概述 “数据库镜像”是一种针对数据库高可用性的基于软件的解决方案.其维护着一个数据库的两个相同的副本,这两个副本分别放置在不同的SQL Server ...

  2. python学习2——数据类型

    1. python是强类型 动态类型的语言,动态类型表明它可以在声明变量的时候,不必指定数据类型,强类型规定了它不能容忍隐式类型转换 2. python中的不可变类型有:int,string,tupl ...

  3. 六、Solr高亮与Field权重

    Solr高亮 原理 做搜索时,高亮是很常见的需求,那么Solr肯定也为高亮提供了支持.先解释下Solr高亮的原理,在我们设置了需要高亮显示的Field之后,查询得到的返回结果会多出来下面的内容: &q ...

  4. 关于material和sharedMaterial的问题

    在unity3d中,Renderer组件有两个属性:material和sharedMaterial,它们都可以用来获取Renderer的材质属性.但是它们之间却又很大的区别,下面通过示例来讲解一下. ...

  5. 华为手机APK 汉语译名

    华为桌面 删除前要找一个桌面程序代替短信息 不删(貌似自带短信会偷流量..猜测猜测.唉~暂时没办法)输入法 也是删除前要找到替代输入法,否则后果..... 同名的odex也删了,主体不见了留躯壳何用? ...

  6. dwz框架---&lpar;2&rpar;表单回调函数

    dwz中的表单回调函数大概有下面几种: /** * 普通ajax表单提交 * @param {Object} form * @param {Object} callback * @param {Str ...

  7. (转)java的动态代理机制详解

    原文出自:http://www.cnblogs.com/xiaoluo501395377/p/3383130.html 在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一 ...

  8. Oracle JDK 1&period;8 openJDK11 定制化JDK

    小结: 1. https://mp.weixin.qq.com/s/4rkgisFRJxokXZ4lyFXujw 京东JDK在大数据平台的探索与研究 臧琳 亿级流量网站架构 3月11日

  9. PHP中json&lowbar;encode&lpar;&rpar;问题

    PHP 生成JSON的时候,必须将汉字不转义为 \u开头的UNICODE数据. 要想不转义,在后面加个参数即可 json_encode($data, JSON_UNESCAPED_UNICODE);  ...

  10. ubuntu video&comma;gdm swith

    如果已经安装LightDM和GDM登录显示器.那么在Ubuntu下怎么在各种DM间任意切换呢? 以切换到GDM为例,打开终端,使用命令: sudo dpkg-reconfigure gdm 如果已经安 ...