第九周课程总结&实验报告(七)

实验任务详情:

完成火车站售票程序的模拟。
要求:
(1)总票数1000张;
(2)10个窗口同时开始卖票;
(3)卖票过程延时1秒钟;
(4)不能出现一票多卖或卖出负数号票的情况。

实验代码:

package demo;

class MyThread implements Runnable{
    private int ticket = 1000;
    public void run() {
        for (int i=0;i<100;i++){
            synchronized (this){
                if (ticket>0){
                    try {
                        Thread.sleep(1000);
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()+"售票:ticket="+ticket--);
                }
            }
        }
    }
}
public class test {
    public static void main(String[] args) {
        MyThread mt=new MyThread();            
        new Thread(mt,"窗口1").start();                
        new Thread(mt,"窗口2").start();
        new Thread(mt,"窗口3").start();
        new Thread(mt,"窗口4").start();
        new Thread(mt,"窗口5").start();
        new Thread(mt,"窗口6").start();
        new Thread(mt,"窗口7").start();
        new Thread(mt,"窗口8").start();
        new Thread(mt,"窗口9").start();
        new Thread(mt,"窗口10").start();
    }
}

结果截图:

实验总结:

这个题老师上课讲过,书上也有类似的代码,还算比较简单。就是有一个小瑕疵,总是连续一个窗口卖票,也不知道是cpu的问题还是什么。

课程总结:

1)多线程继承Tread类:

class 类名称 extends Thread{
      属性***;
      方法***public void run(){
           线程主体;
      }
}

2)Rnunable接口实现多线程:

class 类名称 implements Runnable{
     属性***;
     方法***public void run(){
          线程主体;
     }
}

3)synchronized

(1)指定加锁对象:对给定对象加锁,进入同步代码前要获得给定对象的锁。

(2)直接作用于实例方法:相当于对当前实例加锁,进入同步代码前要获得当前实例的锁。

(3)直接作用于静态方法:相当于对当前类加锁,进入同步代码前要获得当前类的锁。

原文地址:https://www.cnblogs.com/lyp82ndl/p/11739703.html