• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
羽月科技
博客园    首页    新随笔    联系   管理    订阅  订阅

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

实验任务详情:

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

要求:

(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,让十个窗口都工作
	     
	    }
}

运行结果:

由图三可以看出,此代码虽然无语法错误,但是出现了编号为“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 = ""的值可以设为任意值,也可以设为空值,我就没有设置了。

改进后运行结果:

总结:

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

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

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

posted @ 2019-10-24 23:07  羽月Tech  阅读(177)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3