多线程(多窗口售票:线程间通信问题,因为多个线程操作同一份共享数据)

实现Runnable接口相对继承Thread要简洁些

package com.jn.learning.javalearning.thread;

/***************************************************************************
 *
 * Written by TankPush (Jn)
 *
 * Description:窗口卖票(多线程操作同一份共享数据,实现线程间通信)
 * 1、定义总票数:共享数据
 * 2、定义卖票功能:同步代码块方式实现同步
 *     注意:售票时,因为同一时间只有一个线程售票,所以将售票功能代码包起来(既不能多也不能包少)。
 *           当前线程售票之后调用wait()阻塞并释放锁,
 *           另外新线程进入后调用notify()唤醒当前的阻塞线程,新线程再售票
 *
 ***************************************************************************/
public class Window_SaleTicket{

    public static void main(String[] args) {
        Window windowShare = new Window();

        new Thread(windowShare, "1号窗口").start();
        new Thread(windowShare, "2号窗口").start();
        new Thread(windowShare, "3号窗口").start();
    }
}

class Window implements Runnable{

    private static int ticket = 100;

    @Override
    public void run() {

        while (true) {
            synchronized (this) {
                //线程拿到同步监视器进入后,先唤醒原来阻塞的线程,再进行售票
                this.notify();

                //todo 实现功能:判断票数是否大于0,再决定是否售卖
                if (ticket > 0) {
                    System.out.println(Thread.currentThread().getName() + "售票,票号为: " + ticket);

                    //故意放慢脚步,测试看是否有重票和错票问题(实际代码不需要该部分)
                    try {
                        Thread.sleep(20);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    ticket--;

                    try {
                        this.wait();//售票后,释放同步监视器并进入阻塞,等待被其他线程唤醒
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                } else {
                    break;
                }
            }
        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值