模拟火车站售票程序,开启三个窗口售票(1,2,3) 100张票
使用继承的方式来实现
class Window extends Thread{
// 总票数
static int ticket = 100;
@Override
public void run() {
while (true) {
if (ticket > 0) {
// 打印票号,并且维护计数器
System.out.println(Thread.currentThread().getName()+"售票,票号:"+ticket --);
}else {
// 票已抢完
break;
}
}
}
}
public class TestWindow {
public static void main(String[] args) {
// 开去三个售票窗口
Window w1 = new Window();
Window w2 = new Window();
Window w3 = new Window();
// 设置窗口名称
w1.setName("窗口1");
w2.setName("窗口2");
w3.setName("窗口3");
// 启动售票
w1.start();
w2.start();
w3.start();
}
}
使用实现的方式来实现
class Window1 implements Runnable{
// 总票数
int ticket = 100;
@Override
public void run() {
while (true) {
if (ticket > 0) {
// 打印票号,并且维护计数器
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"售票,票号:"+ticket --);
}else {
// 票已抢完
break;
}
}
}
}
public class TestWindow1 {
public static void main(String[] args) {
Window1 p = new Window1();
Thread t1 = new Thread(p);
Thread t2 = new Thread(p);
Thread t3 = new Thread(p);
t1.setName("窗口1");
t2.setName("窗口2");
t3.setName("窗口3");
t1.start();
t2.start();
t3.start();
}
}
两种方法都引发的问题:此程序存在线程安全问题(重票、错票)
原因:由于一个线程在操作共享数据的过程中,为执行完毕,另外的子线程此时参与进来,导致共享数据出现线程安全问题。
解决方案:
需要采用线程的同步机制