本帖最后由 张综 于 2012-11-16 20:08 编辑
一个模拟售票系统,用到了多线程。先写了一个票库,也就是类名为票库的类,其中写了三个方法,一个是set方法,用来往里传入票数。也就是总票数。一个是get方法。获取还剩多少张票。一个是出票的方法。就是把票库里的票减减,然后写一个Thread类的子类。调用出票方法。然后创建了四个窗口的线程对象。一大印,就会先打出四个100,我知道是刚开始因为四个线程同时启动导致的。请问,怎么解决这个问题。
上代码。。
package cn.itcast.thread.piao.two;
public class Test1 {
public static void main(String[] args) {
PiaoKu pk = new PiaoKu(100);
Thread th1 = new ChuangKouThread(pk, "a");
Thread th2 = new ChuangKouThread(pk, "b");
Thread th3 = new ChuangKouThread(pk, "c");
Thread th4 = new ChuangKouThread(pk, "d");
th1.start();
th2.start();
th3.start();
th4.start();
}
}
/*
* 窗口类
* 有一个票库属性
* 任务中循环出票
* 当发现票数小于等于0时,结束任务
*/
class ChuangKouThread extends Thread {
private PiaoKu pk;
public ChuangKouThread(PiaoKu pk, String name) {
super(name);
this.pk = pk;
}
public void run() {
while(true) {
int cnt = pk.getCount();
if(cnt <= 0) {
break;
}
try {
Thread.sleep(20);
} catch(InterruptedException e) {}
String name = Thread.currentThread().getName();
System.out.println(name + ": " + cnt);
pk.chuPiao();
}
}
}
class PiaoKu {
private int cnt;
public PiaoKu(int cnt) {
this.cnt = cnt;
}
// 返回当前票库的剩余票数
public int getCount() {
return cnt;
}
// 出票方法,就是把票数减减
public void chuPiao() {
this.cnt--;
}
}
|