使用Runnable接口创建线程

Runnable接口

  • 只有一个run()方法

  • Thread类实现了Runable接口

  • 便于多个线程共享资源

  • Java不支持多继承,如果已经继承了某个基类,便要实现Runnable接口类生成多线程以实现Runnable的对象为参数建立新的线程

两种线程构造方式的比较

- 使用Runnable接口

可以将cpu、代码和数据分开,形成清晰的模型,还可以从其他类继承

- 直接继承Thread类

编写简单,直接继承,重写run方法,不能再从其他类继承


实例

运行结果:

开启线程

主线程结束

thread3准备休眠:1750

thread1准备休眠:1889

thread2准备休眠:186

thread2休眠结束

thread3休眠结束

thread1休眠结束


线程内部数据共享

用同一个实现了Runnable接口的对象作为参数创建多个线程,多个线程共享同一个对象中的相同的数据

运行结果:

开启线程

结束线程

thread1准备休眠:2224

thread3准备休眠:2224

thread2准备休眠:2224

thread1休眠结束

thread2休眠结束

thread3休眠结束

说明:

因为是用同一个Runnable类型对象创建的3个新线程,这三个线程就共享了这个对象的私有成员sleepTime,在本次运行中,三个线程都休眠了2224毫秒

线程安全问题:

对于有一些应用,数据共享是不安全的 ,而且恰好应用中的某个类是单例的,那么就不要把数据写为成员变量,比如HttpServlet。

案例2:独立且同时运行的线程有时需要共享一些数据并且考虑到彼此的状态和动作.

  • 用三个线程模拟三个售票口,总共出售20张票

  • 用3个线程模仿3个售票口的售票行为

  • 这3个线程应该共享20张票的数据

运行结果:

开始售票

售票口1号出售票号:20

.....

售票口3号出售票号:3

售票口3号出售票号:1

售票口1号出售票号:4

售票口1号结束

售票口3号结束

售票口2号出售票号:2

售票口2号结束

说明:

在这个例子中,创建了3个线程,每个线程调用的是同一个SellTickets对象中的run()方法,访问的是同一个对象中的变量(tickets)

如果是通过创建Thread的子类来模拟售票过程,再创建3个线程,则每个线程都会有各自的方法和变量,虽然方法是相同的,但变量却是各自有20张票,因而结果将会是各卖出20张票,和业务需求不符合了。

java多线程(六)的更多相关文章

  1. Java多线程(六) —— 线程并发库之并发容器

    参考文献: http://www.blogjava.net/xylz/archive/2010/07/19/326527.html 一.ConcurrentMap API 从这一节开始正式进入并发容器 ...

  2. Java多线程——<六>更方便的线程

    一.概述 标题很抽象,什么叫更方便?更是相比谁来说的呢? 原来,我们定义任务,都是实现自Runnable或者Callable接口,但是这样必然需要你将新定义的任务附着给线程,然后再调用线程启动.在不考 ...

  3. Java多线程(六) 线程系列总结

    多线程系列终于终结得差不多,本人对该系列所做的总结大致如下: 线程锁模块耗费了大量的时间,底层的AQS实现比较复杂.仍然没有时间总结源码部分,能够坚持写下这么几个篇幅的内容真心佩服自己....希望继续 ...

  4. java多线程(六)-线程的状态和常用的方法

    一个线程可以处于以下几种状态之一: (1) 新建(new):当线程被创建时,它只会短暂的处于这种状态,此时它已经获得了必须的系统资源,并执行了初始化,该线程已经有资格获取cpu时间了,之后它将转化为可 ...

  5. Java多线程——<八>多线程其他概念

    一.概述 到第八节,就把多线程基本的概念都说完了.把前面的所有文章加连接在此: Java多线程——<一>概述.定义任务 Java多线程——<二>将任务交给线程,线程声明及启动 ...

  6. 从ConcurrentHashMap的演进看Java多线程核心技术 Java进阶(六)

    本文分析了HashMap的实现原理,以及resize可能引起死循环和Fast-fail等线程不安全行为.同时结合源码从数据结构,寻址方式,同步方式,计算size等角度分析了JDK 1.7和JDK 1. ...

  7. java多线程系列(六)---线程池原理及其使用

    线程池 前言:如有不正确的地方,还望指正. 目录 认识cpu.核心与线程 java多线程系列(一)之java多线程技能 java多线程系列(二)之对象变量的并发访问 java多线程系列(三)之等待通知 ...

  8. Java多线程父子线程关系 多线程中篇(六)

    有的时候对于Java多线程,我们会听到“父线程.子线程”的概念. 严格的说,Java中不存在实质上的父子关系 没有方法可以获取一个线程的父线程,也没有方法可以获取一个线程所有的子线程 子线程的消亡与父 ...

  9. “全栈2019”Java多线程第二十六章:同步方法生产者与消费者线程

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  10. “全栈2019”Java多线程第十六章:同步synchronized关键字详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

随机推荐

  1. 基于nodejs的开源博客

    https://github.com/hexojs/hexo https://hexo.io/zh-cn/docs/ markdown编辑器 http://pandao.github.io/edito ...

  2. C#------?和??运算符的作用

    转载: http://www.cnblogs.com/zfanlong1314/archive/2012/02/26/2390456.html 1.?的作用 在处理数据库和其他包含不可赋值的元素的数据 ...

  3. hdu 4849 最短路 西安邀请赛 Wow! Such City!

    http://acm.hdu.edu.cn/showproblem.php?pid=4849 会有非常多奇怪的Wa的题.当初在西安就不知道为什么wa,昨晚做了,由于一些Sb错误也wa了非常久.这会儿怎 ...

  4. mybatis由浅入深day01_4.9删除用户_4.10更新用户

    4.9 删除用户 4.9.1 映射文件 4.9.2 代码: 控制台: 4.10 更新用户 4.10.1 映射文件 4.10.2 代码 控制台:

  5. VS2015编译GDAL2.2.1源码

    下载完GDAL2.2.1,你会发现这货没有CMakeLists.txt,对于我这样的只会用CMake GUI的货来说,着实很难过. 需要用VS带的nmake来生成.sln 管理员身份启动VS2015命 ...

  6. img标签-srcset属性

    今天看前辈的代码时,发现img标签有个陌生的srcset属性,如下: 1 <img class="Avatar" src="https://pic3.zhimg.c ...

  7. 计算时间:一个C++运算符重载示例

    Time类是一个用于计算时间的类,其原型如下:程序清单11.1 mytime0.h // mytime0.h -- Time class before operator overloading #if ...

  8. cache buffers chains以及热块解决方案

    cache buffers chains以及热块解决方案 今天是2013-10-10,今天下午我调休了,中午饭过后从14点一直睡到16点,这种感觉真爽.  之前学习过关于buffer cache的ca ...

  9. 如何搭建本地WordPress

    今天就来介绍一下如何在Windows下搭建本地WordPress. 安装前准备 1.正常的电脑 2.PHPNow  http://www.phpnow.org 这里面的PHPNow环境包其实包含了常见 ...

  10. LeetCode——Implement Stack using Queues

    Description: Implement the following operations of a stack using queues. push(x) -- Push element x o ...