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

实验任务详情:

完成火车站售票程序的模拟。

要求:

(1)总票数1000张;

(2)10个窗口同时开始卖票;

(3)卖票过程延时1秒钟;

(4)不能出现一票多卖或卖出负数号票的情况。

实验代码:

package work;
public class ck extends Thread {   //继承Thread
            public ck(String name) {
                 super(name); //给线程名字赋值(窗口编号)
            }
            static int tick = 1000; //设置1000张票
            public void run() {   //重写run方法
                while(tick > 0) {
                        if (tick > 0) {
                            System.out.println(getName() + "售票成功,车票编号:" + tick);    //getName,获取窗口编号(线程名称)
                            tick--;
                        } else {
                            System.out.println("售票失败,余票为0!");
                        }
                    }
                    try {
                         sleep(1000);    //卖票过程延时1秒钟
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                 
                }
    
}
package work;

public class Main {

        public static void main(String[] args) {
             ck sp1=new ck("窗口1");
             ck sp2=new ck("窗口2");
             ck sp3=new ck("窗口3");
             ck sp4=new ck("窗口4");
             ck sp5=new ck("窗口5");
             ck sp6=new ck("窗口6");
             ck sp7=new ck("窗口7");
             ck sp8=new ck("窗口8");
             ck sp9=new ck("窗口9");
             ck sp10=new ck("窗口10");  //10个窗口卖票

             sp1.start();
             sp2.start();
             sp3.start();
             sp4.start();
             sp5.start();
             sp6.start();
             sp7.start();
             sp8.start();
             sp9.start();
             sp10.start();   //start,让十个窗口都工作
         
        }
}

运行结果:

第九周课程总结&实验报告(七)_第1张图片

第九周课程总结&实验报告(七)_第2张图片

第九周课程总结&实验报告(七)_第3张图片

由图三可以看出,此代码虽然无语法错误,但是出现了编号为“1000”的车票售卖了两次的情况。查找各种原因后发现未设置“锁”,于是对代码进行了如下改进:

package work;
public class ck extends Thread {   //继承Thread
            public ck(String name) {
                 super(name); //给线程名字赋值(窗口编号)
            }
            static int tick = 1000; //设置1000张票
            static Object swxy = "";
            public void run() {   //重写run方法
                while(tick > 0) {
                    synchronized (swxy) {
                        if (tick > 0) {
                            System.out.println(getName() + "售票成功,车票编号:" + tick);    //getName,获取窗口编号(线程名称)
                            tick--;
                        } else {
                            System.out.println("售票失败,余票为0!");
                        }
                    }
                    try {
                         sleep(1000);    //卖票过程延时1秒钟
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                 
                }
    
}
}

添加的语句为:

static Object swxy = "";
synchronized (swxy)

其中,swxy = ""的值可以设为任意值,也可以设为空值,我就没有设置了。

改进后运行结果:

第九周课程总结&实验报告(七)_第4张图片

总结:

1、线程有优先级,但是优先级最高不一定最先运行,运行先后取决于CPU调用;

2、线程创建后要使用start()方法让其运行;

3、继承Thread,必须重写run()方法。

你可能感兴趣的:(第九周课程总结&实验报告(七))