使用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. linux用户态定时器的使用---19

    原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/ linux操作系统为每一个进程提供了3个内部计时器. ITIMER_REAL;ITIMER_VI ...

  2. Cesium - 离线使用方法

    使用Cesium可以直观的看基于DEM切片产生的Terrain地形数据,有种身临其境的感觉,但缺点是Cesium默认缺省加载了微软Bing提供的地形以及遥感影像数据,可以跟踪日志,总提示让你申请微软的 ...

  3. JS面向对象编程学习

    学习目标:1.掌握JS中的类(原型对象)和对象.2.什么是成员变量和成员方法.3.掌握构造方法的使用.补充:关于双等号(==):1.如果等号两边都是字符串时,则比较内容是否相等2.如果等号两边是数字时 ...

  4. JS基本动画

    <style type="text/css"> .color_red { background: red; } div { position: absolute; to ...

  5. java基础---->多线程之interrupt(九)

    这里我们通过实例来学习一下java多线程中关于interrupt方法的一些知识.执者失之.我想当一个诗人的时候,我就失去了诗,我想当一个人的时候,我就失去了我自己.在你什么也不想要的时候,一切如期而来 ...

  6. Struts2中的OGNL详解 《转》

    首先了解下OGNL的概念: OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的 ...

  7. mysql in查询排序问题

    SQL: select * from table where id IN (3,6,9,1,2,5,8,7); 这样的情况取出来后,其实,id还是按1,2,3,4,5,6,7,8,9,排序的,但如果我 ...

  8. 【BZOJ4144】[AMPPZ2014]Petrol 最短路+离线+最小生成树

    [BZOJ4144][AMPPZ2014]Petrol Description 给定一个n个点.m条边的带权无向图,其中有s个点是加油站. 每辆车都有一个油量上限b,即每次行走距离不能超过b,但在加油 ...

  9. Unity3D笔记七 GUILayout

    一.说到GUILayout就要提到GUI,二者的区别是什么 GUILayout是游戏界面的布局.GUI(界面)和GUILayout(界面布局)功能上面是相似的从命名中就可以看到这两个东西非常相像,但是 ...

  10. mybatis-config.xml配置

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...