操作系统实验一:并发程序设计

一、实验目的

1)加深对进程并发执行的理解,认识多进程并发执行的实质。

2)观察进程共享资源的现象,学习解决进程互斥和同步的方法。

 

二、实验要求:

本实验要求用高级语言,启动多进程并发运行,设计相应代码,显示进程无关并发、进程共享变量并发的运行结果。并完成实验报告。

  

三、实验内容:

分别实现以下四种情况的并发:

1.并发的进程之间无关,显示进程名称,开始与结束时间。

模拟多终端售票情况,并发的多个终端进程之间共享剩余票数这个共享变量。

2.用全局变量实现。

3.用进程间共享数据机制实现。

4.用进程间共享数据机制和加锁机制实现。

 

四、实验过程与结果

  1. 算法思想与设计
  2. 算法实现代码
  3. 运行结果
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;
    }
}
posted @ 2019-05-16 21:17  李健国  阅读(259)  评论(0编辑  收藏  举报