实现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;
}
}
}
}
}