实验任务详情:
完成火车站售票程序的模拟。
要求:
(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()方法。