需求
某电影院目前正在上映国产大片,共有100张票,而它有3个窗口卖票,请设计一个程序模拟该电影院卖票,并保证线程同步,不会出现错误的买票数据。
1、写一个实现Runnable接口的类,需要重写run方法,通过同步方法改善数据安全问题
package Day11_多线程.Demo04_同步方法_卖票改进版;
//同步方法解决数据安全问题
public class MyRunnable_01 implements Runnable {
private static int tickes = 100;
@Override
public void run() {
while (true) {
//等待的时间100毫秒的时候为了防止其他线程抢cpu,提前锁起来任意对象obj
/*try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
MyRannable01();
}
}
//同步方法 (非静态同步方法的锁对象是this)
public synchronized void MyRannable01() {
if (tickes > 0) {
System.out.println(Thread.currentThread().getName() + "在卖第" + tickes + "张票");
tickes--;
}
}
/* //静态同步方法-格式1(锁对象是当前类的字节码文件对象)
public static synchronized void MyRannable02() {
if (tickes > 0) {
System.out.println(Thread.currentThread().getName() + "在卖第" + tickes + "张票");
tickes--;
}
}
//静态同步方法-格式2
public synchronized static void MyRannable03() {
if (tickes > 0) {
System.out.println(Thread.currentThread().getName() + "在卖第" + tickes + "张票");
tickes--;
}
}*/
}
2、写一个测试类,开启三个线程
package Day11_多线程.Demo04_同步方法_卖票改进版;
public class Test01 {
public static void main(String[] args) {
MyRunnable_01 mr = new MyRunnable_01();
Thread t1 = new Thread(mr, "一号窗口");
Thread t2 = new Thread(mr, "二号窗口");
Thread t3 = new Thread(mr, "三号窗口");
t1.start();
t2.start();
t3.start();
}
}