当前课程知识点:JAVA程序设计进阶 >  第一章 线程(上) >  1.6 线程内部的数据共享 >  Video

返回《JAVA程序设计进阶》慕课在线视频课程列表

Video在线视频

Video

下一节:Video

返回《JAVA程序设计进阶》慕课在线视频列表

Video课程教案、知识点、字幕

同样一个线程类

它可以实例化出很多线程

那这一节我们将介绍

如何实现线程内部的数据共享

我们在前面提到过

同样一个线程

它们是可以共享

它们的代码和数据

那也就是说当我们

实现了Runnable接口的这个类

它所实例出来的对象的话

它去构造出的线程

它们之间是可以共享它们的代码

和它们之间的一些数据的

也就是说同一个线程

会共享我们同一个

Runnable对象中的相同的数据

下边我们通过例子大家就能看到

我们这个例子它的类是

ShareTargetTester

我们看看主方法

主方法第一句就是

TestThread threadobj

等于new testThread

紧接着的打印出来

是Starting threads

好 我们看一下下面这个三句话

new Thread

第一个参数是threadobj

第二参数是Thread1

然后调用它的(英文)方法

那其实我们是构造一个线程

那这个线程要执行的代码

来自于threadobj这个对象

那这个线程的名字

我们给它叫Thread1

那这个和它类似的

我们又构造了Thread2 Thread3

然后这三个线程都启动以后

我们在主线程中打印说

Threads started main ends

那下面我们特别关键的就是说

TestThread

就是Threadobj这个对象

它到底有什么样的功能

我们看一下

class TestThread

implements Runnable

它实现Runnable接口

然后这里面有一个成员变量

sleep Time

然后通过构造方法

来去把这sleep Time的值给确定

也就是0到6千之间的一个随机数

那在它的run方法里面

实际上和大家刚才

前面看到的例子是一样的

也就是让我们这个线程

休眠0到6

好 我们看看这个运行的结果

可能会稍微出乎大家的意料

我们看一下 Stating

好 现在启动

然后Thread1 going

to sleep for966毫秒

然后Thread2 going

to sleep for966毫秒

紧接着Threadl stasted

main ends

主线程在这时候结束了

然后Thredd3 going to

sleep for 966

最后的话是这个

Thread1到Thread3运行结束了

大家看到这个例子里面

有一个很有趣的现象

也就是说这三个线程

它们的休眠时间竟然是一样的

那在上面那个例子的时候

我们看到我们那个三个线程

实际上它的休眠时间是不一样的

那为什么在这个例子里面

这三个线程它休眠时间是一样呢

是因为我们采用Runnable的

这种构造线程的方式

来定义这个线程的对象

那这个三个线程

它实际上就会共享这个

这个对象的私有成员speepTime

所以在这个运行的过程当中

它们三个线程都休眠了

同样的966毫秒

那这个例子主要是想告诉大家

通过Runnable来构造

我们的线程体的话

那里面的这些数据

它就会被这个线程对象所共享

所以我们需要明白

独立且同时运行的线程

有时候它需要共享一些数据

并且它之间

相互之间会有一些

这个彼此的状态和动作

都需要大家去考虑

那我们再看另外一个例子

现在我们想用三个线程

来模拟三个售票口

然后总票数是200张

然后让这三个售票口

来去共同这个销售这200张票

那我们看这个程序应该怎么写

我们看一下第一个类

public class

SellTickets Tester

我们看一下主方法

主方法里面

SellTickets t

=new SellTickets

实例化SellTickets这个对象

然后new Thread t.start

利用这个t来构造一个线程

然后再启动它

然后依次构造了三个线程

然后并启动

那我们就比较好奇了

到底这SellTickets这个类

完成什么样的功能呢

我们往下看

class SellTickets

implements Runnable

那SellTickets

实现了接口Runnable

private int tickets=200

我们这里定义了

它的这个要销售的

这个票数的总数是200

而我们在看它的run方法

while tickets大于0

也就是说有票

那我们就要卖票

那怎么卖票呢

我们看一下它打印出来

System.out.println

Thread.currentThreadgetName

也就是当前的线程的名字

再加上什么呢

is selling ticket

某个线程也就是

某个销售的窗口正在卖票

然后卖完票以后

紧接着打印出tickets--

卖出哪张票

然后这个票的话

它这个数量要往下减

我们看一下整个程序的运行结果

这个程序的运行结果

当然这是我们某一次

运行的结果的最后几行

也就是最后几行

正好是在剩下六张票的时候

依次有我们这几个线程

去把它给这个销售完毕

那在这个例子当中

我们创建了三个线程

然后每个线程调用的是同一个

SellTickets对象中的run方法

然后它的好处访问的是

同一个对象中的变量tickets

也就是说我们原来设计的

这个思路达到了

也就我们让三个销售窗口

去共同销售200张票

但是如果我们不是采用

Runnable这种方式

来去构造线程的话

假设我们采用另外一种方式

就分别构造这个三个线程

就是我们通过创建Thread类

它的子类来模拟销售

这个售票的过程

那这个时候会有什么不同

就会说它们是每一个线程

都各自销售200张票

而不是像我们当前这个例子

是三个售票窗口共同卖200张票

所以通过这个例子

大家也能体会到

采用Runnable接口

来去创建线程

和直接写Thread类的子类的话

它们在数据的共享上

还是有所区别的

那大家可以根据它们这些特性

再根据你未来自己编程序的需要

来决定你到底采用

是Runnable接口来实现线程呢

还是直接去继承Thread类

来实现线程

在本节当中我们通过几个例子

介绍了线程之间的数据共享

这就是本节的内容

下面我们总结一下

本章的学习内容

在本章当中我们学习的

线程的基础知识

以及线程之间的数据共享

希望经过本章的学习

要求同学们要掌握

线程的基本概念

学会如何通过Thread类

和Runnable接口来创建线程

并且要学会实现

多线程之间的数据共享

这就是本讲的内容

JAVA程序设计进阶课程列表:

第一章 线程(上)

-1.0 导学

--Video

-1.1 线程的基本概念

--Video

-1.1 线程的基本概念--作业

-1.2 通过Thread类创建线程

--Video

-1.2 通过Thread类创建线程--作业

-1.3 线程的休眠

--Video

-1.3 线程的休眠--作业

-1.4 Thread类详解

--Video

-1.5 通过Runnable接口创建线程

--Video

-1.5 通过Runnable接口创建线程--作业

-1.6 线程内部的数据共享

--Video

第二章 线程(中)

-2.0 导学

--Video

-2.1 线程同步的思路

--Video

-2.2 线程同步的实现方式—Synchronization

--Video

-2.3 线程的等待与唤醒

--Video

-2.4 后台进程

--Video

-2.5 线程的生命周期与死锁

--Video

-2.6 线程的调度

--Video

第三章 线程(下)

-3.0 导学

--Video

-3.1 线程安全与线程兼容与对立

--Video

-3.2 线程的安全实现-互斥同步

--Video

-3.3 线程的安全实现-非阻塞同步

--Video

-3.4 线程的安全实现-无同步方案

--Video

-3.5 锁优化

--Video

第四章 网络编程(上)

-4.0 导学

--Video

-4.1 URL对象

--Video

-4.2 URLConnection对象

--Video

-4.3 Get请求与Post请求

--Video

-4.4 Socket通信原理

--Video

-4.5 Socket通信实现

--Video

第五章 网络编程(下)

-5.0 导学

--Video

-5.1 Socket 多客户端通信实现

--Video

-5.2 数据报通信

--Video

-5.3 使用数据报进行广播通信

--Video

-5.4 网络聊天程序

--Video

第六章 Java虚拟机

-6.0 导学

--Video

-6.1 Java虚拟机概念

--Video

-6.2 Java虚拟机内存划分

--Video

-6.3 Java虚拟机类加载机制

--Video

-6.4 判断对象是否存活算法及对象引用

--Video

-6.5 分代垃圾回收

--Video

-6.6 典型的垃圾收集算法

--Video

-6.7典型的垃圾收集器

--Video

第七章 深入集合Collection

-7.0 导学

--Video

-7.1 集合框架与ArrayList

--Video

-7.2 LinkedList

--Video

-7.3 HashMap与HashTable

--Video

-7.4 TreeMap与LinkedHashMap

--Video

-7.5 HashSet

--Video

第八章 反射与代理机制

-8.0 导学

--Video

-8.1 Java反射机制

--Video

-8.2 Java静态代理

--Video

-8.3 Java动态代理

--Video

-8.4 Java 反射扩展-jvm加载类原理

--Video

-8.5 Java进阶课程总结

--Video

Video笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。