当前课程知识点:JAVA程序设计进阶 > 第一章 线程(上) > 1.6 线程内部的数据共享 > 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接口来创建线程
并且要学会实现
多线程之间的数据共享
这就是本讲的内容
-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
-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
-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