一共有 50张票 ,4个窗口出售,打印出票售出的顺序。
package com.problem3;
public class Demo {
// 一共有 50张票 ,4个窗口出售,打印出票售出的顺序。
public static void main(String[] args) {
// 设票有50张
int count = 50;
// 实例化MyThread类,并传入票数
MyThread myThread = new MyThread(count);
// 创建四个线程,调用实例化的类,并给进程赋名字,start使其进入就绪状态,使该四个线程操作同一块数据
new Thread(myThread, "梅").start();
new Thread(myThread, "兰").start();
new Thread(myThread, "竹").start();
new Thread(myThread, "菊").start();
}
}
package com.problem3;
//实现接口Runnable,并重写run方法
public class MyThread implements Runnable {
// 定义私有属性,票的数量
private int count;
// 定义构造函数,传参
public MyThread(int count) {
this.count = count;
}
// 重写run方法
@Override
public void run() {
// 获取实例化该类的当前线程的名字,并赋值给字符串
String name = Thread.currentThread().getName();
boolean flag = true;
while (flag) {
// 进程同步使用synchroized关键字修饰同步块
// 当某时刻某个进程在操作该资源的时候不允许有其他进程操作这块资源
synchronized (this) {
if (count > 0) {
System.out.println(name + "卖出了" + count);
count--;
}
// 让当前处于运行状态的线程处于就绪状态,
// 以便重新让本线程进入云心状态或让其他线程能从就绪状态转为运行状态
Thread.yield();
}
// 当票卖到0张的时候,退出循环
if (count == 0) {
flag = false;
}
}
}
}