使用5个线程模拟5个售票窗口,共同卖出10000张票(1号至1万号); 要求: 1:数据不能出现重复和超出范围的票号; 2:分别使用同步方法,同步代码块,lock接口三种方式,各实现1次;
时间: 2024-02-18 19:04:09 浏览: 18
好的,这是一个多线程编程问题。下面我会分别给出三种方式的实现代码。
1. 同步方法
```java
public class Ticket implements Runnable {
private static int ticketNum = 10000;
private static int count = 0;
@Override
public void run() {
while (true) {
synchronized (this) {
if (ticketNum > 0) {
count++;
int currentTicketNum = ticketNum;
ticketNum--;
System.out.println(Thread.currentThread().getName() + "售出第" + currentTicketNum + "张票");
} else {
break;
}
}
}
System.out.println(Thread.currentThread().getName() + "共售出" + count + "张票");
}
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(ticket, "窗口1").start();
new Thread(ticket, "窗口2").start();
new Thread(ticket, "窗口3").start();
new Thread(ticket, "窗口4").start();
new Thread(ticket, "窗口5").start();
}
}
```
2. 同步代码块
```java
public class Ticket implements Runnable {
private static int ticketNum = 10000;
private static int count = 0;
private static Object lock = new Object();
@Override
public void run() {
while (true) {
synchronized (lock) {
if (ticketNum > 0) {
count++;
int currentTicketNum = ticketNum;
ticketNum--;
System.out.println(Thread.currentThread().getName() + "售出第" + currentTicketNum + "张票");
} else {
break;
}
}
}
System.out.println(Thread.currentThread().getName() + "共售出" + count + "张票");
}
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(ticket, "窗口1").start();
new Thread(ticket, "窗口2").start();
new Thread(ticket, "窗口3").start();
new Thread(ticket, "窗口4").start();
new Thread(ticket, "窗口5").start();
}
}
```
3. Lock接口
```java
public class Ticket implements Runnable {
private static int ticketNum = 10000;
private static int count = 0;
private static Lock lock = new ReentrantLock();
@Override
public void run() {
while (true) {
try {
lock.lock();
if (ticketNum > 0) {
count++;
int currentTicketNum = ticketNum;
ticketNum--;
System.out.println(Thread.currentThread().getName() + "售出第" + currentTicketNum + "张票");
} else {
break;
}
} finally {
lock.unlock();
}
}
System.out.println(Thread.currentThread().getName() + "共售出" + count + "张票");
}
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(ticket, "窗口1").start();
new Thread(ticket, "窗口2").start();
new Thread(ticket, "窗口3").start();
new Thread(ticket, "窗口4").start();
new Thread(ticket, "窗口5").start();
}
}
```
以上三种方式都能够实现多线程卖票并且保证数据不重复和不超出范围,只是实现方式略有不同。其中,使用同步方法和同步代码块都是使用了Java中的synchronized关键字来实现同步;而使用Lock接口则是使用了Java中提供的Lock接口来实现同步。