多线程编程技术 (2)
辽宁经济职业技术学院信息系
硕士、副教授 陈英
银行模型图示
存款 存款操作贷款操作
银行
计算机的
操作是重
叠的
存款
贷款
职员 1
职员 2
线程的各种状态
新线程
被中断
可运行

睡眠 睡眠结束
在 I/O上中断 等待
通知
Run方法退出停止
启动
银行模型程序
银行模型实际上是一个对帐户进行操作的计算机,
并且这个帐户是独立存储的。每名职员都直接与
银行通信。
在银行模型程序中,定义以下五个类表示银行操
作:
1) Bank 类,表示银行计算机。
2) Account类,表示银行中的帐户。
3) Transaction类,表示帐户的一个事务,例如存款或
者借贷。
4) Clerk类,表示一个银行职员。
5) 包含 main()方法的 BankOperation类,用于启动处
理过程并且确定如何工作。
线程的管理
当两个或多个线程共享公用资源时,如一个
文件或者一块内存区,你需要采取一些步骤
来保证其中一个线程不会在此资源仍然被另
一线程使用的时候修改该资源。
如果在一个线程正在检索一条记录的时候让
另一个线程更改这条记录,那么就会出现灾
难性的结果。
管理这程情况的办法之一是对相关的线程使
用 同步处理 (synchronized)。
同步处理
进行同步处理的目的是为了保证当多个
线程想访问一个资源时,在任何给定的
时间都只有一个线程可以访问。
有两种方法可以采用同步处理来管理自
己的线程:
1) 可以在方法级管理代码,这里涉及到方法
的同步。
2) 可以在代码块级管理代码,使用同步代码
块。
存款操作
贷款操作
theBank.doTransaction()
存款操作
贷款操作
theBank.doTransaction()
职员 2线程主线程职员 1线程
职员 1 职员 2
帐户 帐户
Clerk1.run() Clerk2.run()
main()
Clerk1,doTransaction()
Clerk2,doTransaction()
同步
同步
通知
通知
同步 同步
线程的优先权
某一时刻只有一个线程在执行,调度策略为固定
优先级调度,
newthread.setPriority(Thread.MIN_PRIORITY)
线程的级别有,
1) MIN-PRIORITY
2) NOM_PRIORITY
3) MAX-PRIORITY
自私的线程,有很高的优先权的线程,不主动睡眠
或让出处理器控制权,
其它常用的方法
isAlive:判断线程目前是否正在执行状态中
if(newthread.isAlive()) newthread.stop();
resume:要求被暂停得线程继续执行
suspend:暂停线程的执行
join:等待线程执行完毕
thatThread.join();
被等待的那个线程不结束,当前线程就一直等待,
yield:
将执行的权力交给其它线程,自己到队列的最后等
待,
多线程问题 ---资源协调
对共享对象的访问必须同步,叫做条件变量,
Java语言允许通过监视器 (有的参考书称其为管程 )使
用条件变量实现线程同步,
监视器阻止两个线程同时访问同一个条件变量,它的如
同锁一样作用在数据上,
线程 1进入 withdrawal方法时,获得监视器 (加锁 );当线
程 1的方法执行完毕返回时,释放监视器 (开锁 ),线程 2的
withdrawal方能进入,
withdrawal()
线程 1
监视器 线程 2
多线程问题 ---资源协调
用 synchronized来标识的区域或方法即为监视
器监视的部分。
一个类或一个对象由一个监视器,如果一个程
序内有两个方法使用 synchronized标志,则他
们在一个监视器管理之下,
一般情况下,只在方法的层次上使用关键区
read write



线程 1 线程 2
多线程问题 ---资源协调
2,等待同步数据
生产者 消费者
.
.
共享对象
write read
可能出现的问题,
? 生产者比消费者快时,消费者会漏掉一些数据
没有取到
? 消费者比生产者快时,消费者取相同的数据,
? notify()和 wait ()方法用来协调读取的关系,
? notify()和 wait ()都只能从同步方法中的调用,
多线程问题 ---资源协调
notify的作用是唤醒正在等待同一个监视器
的线程,
wait的作用是让当前线程等待
信息版例子
read()方法在读信息之前先等待,直到信息可
读,读完后通知要写的线程,
write()方法在写信息之前先等待,直到信息
被取走,写完后通知要读的进程,
DemoWait.class--->f4.bat