多线程模拟售票,并显示余票,代码及详解如下
package com.by.thread;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class MyThread extends Thread {
//加入static 线程共用一把锁,如果不加,则会出现重复售票
static int num = 0;
static Lock lock = new ReentrantLock();
public static void main(String[] args) {
//创建线程对象
MyThread t1=new MyThread();
MyThread t2=new MyThread();
MyThread t3=new MyThread();
//给线程起名
t1.setName("窗口一");
t2.setName("窗口二");
t3.setName("窗口三");
//开启线程
t1.start();
t2.start();
t3.start();
}
public void run() {
while (true) {
//线程进去以后上锁,其他线程进不去,只能等待当前线程释放锁
lock.lock();
try {
//线程睡眠十毫秒
Thread.sleep(10);
if (num < 100) {
num++;
System.out.println(getName() + "正在卖第" + num + "张票");
} else {
//当num=100时,及票已售完,跳出循环,结束
break;
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
//finally 代码一定会执行,释放锁
lock.unlock();
}
}
}
}