一、实验目的
(1)加深对进程并发执行的理解,认识多进程并发执行的实质。
(2)观察进程共享资源的现象,学习解决进程互斥和同步的方法。
二、实验要求:
本实验要求用高级语言,启动多进程并发运行,设计相应代码,显示进程无关并发、进程共享变量并发的运行结果。并完成实验报告。
三、实验内容:
分别实现以下四种情况的并发:
1.并发的进程之间无关,显示进程名称,开始与结束时间。
模拟多终端售票情况,并发的多个终端进程之间共享剩余票数这个共享变量。
2.用全局变量实现。
3.用进程间共享数据机制实现。
4.用进程间共享数据机制和加锁机制实现。
四、实验过程与结果
- 算法思想与设计
- 算法实现代码
- 运行结果
public
class
SellTicket
implements
Runnable{
public
static
void
main(String[] agrs){
Object A =
"A"
;
//对象A的锁
Object B =
"B"
;
//对象B的锁
Object C =
"C"
;
SellTicket sA =
new
SellTicket(C,A);
SellTicket sB =
new
SellTicket(A,B);
SellTicket sC =
new
SellTicket(B,C);
Thread tA =
new
Thread(sA,
"A线程"
);
Thread tB =
new
Thread(sB,
"B线程"
);
Thread tC =
new
Thread(sC,
"C线程"
);
tA.start();
try
{
Thread.sleep(
100
);
}
catch
(InterruptedException e){
e.printStackTrace();
}
tB.start();
try
{
Thread.sleep(
100
);
}
catch
(InterruptedException e){
e.printStackTrace();
}
tC.start();
try
{
Thread.sleep(
10000
);
}
catch
(InterruptedException e){
e.printStackTrace();
}
synchronized
(B){
B.notify();
}
}
public
static
int
count =
10
;
//全局票数
public
volatile
boolean
why =
true
;
private
Object prev;
private
Object self;
public
SellTicket(Object prev,Object self){
this
.prev = prev;
this
.self = self;
}
@Override
public
void
run(){
while
(print());
}
private
boolean
print(){
while
(count >
0
){
synchronized
(prev) {
synchronized
(self){
System.out.println(Thread.currentThread().getName() + "卖出第:" + count-- + "张,剩余"+count+"张");
count --;
System.out.println(Thread.currentThread().getName()+ self +
".notify"
);
self.notify();
}
if
(!(count==
0
)){
try
{
System.out.println(Thread.currentThread().getName() + prev +
".wait"
);
prev.wait();
}
catch
(InterruptedException e){
e.printStackTrace();
}
}
}
System.out.println(Thread.currentThread().getName()+"return true");
return
true
;
}
System.out.println(Thread.currentThread().getName()+"return false");
return
false
;
}
}