Java编写程序假设有 100张火车票,创建 10 个线程模拟 0个售票点,每个售票点100 毫秒卖一张票。打印出售票过程,注意使用synchronized 确保同一张票只能卖出一次。
时间: 2023-06-05 15:05:52 浏览: 212
好的,这是一个关于Java编程的问题。让我来回答。为了保证同一张火车票只能售出一次,我们可以使用synchronized来实现线程的同步,确保同一时间只有一个线程可以访问共享资源(即火车票)。在程序中,我们可以创建一个Ticket类,用来表示每张火车票,还可以创建一个TicketSeller类,用来表示售票点。在TicketSeller类中,我们可以创建一个synchronized方法来模拟售票过程,每次执行该方法时,首先判断火车票是否已经售完,如果没有,则将该张火车票售出,并打印出售票信息。在程序中,我们可以创建10个TicketSeller线程,模拟10个售票点,每个线程每100毫秒售出一张票,最终打印出售票的过程。
相关问题
用java编写程序。假设有火车票100张,创建10个线程模拟10个售票点,每个售票点100毫秒卖一张票。打印出售票过程,注意使用synchronized确保同一张票只能卖出一次。
好的,我来给您编写一个Java程序,实现您的需求:
```java
public class TicketSelling implements Runnable {
private static int tickets = 100; // 总票数
private static int count = 0; // 已售票数
private int id; // 线程编号
public TicketSelling(int id) {
this.id = id;
}
@Override
public void run() {
while (count < tickets) {
synchronized (TicketSelling.class) { // 加锁
if (count < tickets) {
try {
Thread.sleep(100); // 模拟卖票时间
} catch (InterruptedException e) {
e.printStackTrace();
}
count++;
System.out.println("售票点" + id + "售出第" + count + "张票。");
}
}
}
}
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
new Thread(new TicketSelling(i)).start();
}
}
}
```
程序中使用了`synchronized`关键字来确保同一时刻只有一个线程能够访问共享资源,即售票过程。程序输出每个售票点售出的票数,直到全部售完为止。
希望我的回答能够帮到您!
假设有100张火车票,创建10个线程模拟10个售票点,每个售票点100毫秒卖一张票。打印出售票过程,注意使用synchronized确保同一张票只能卖出一次。用java 编写代码
好的,这是一个简单的多线程编程问题,下面是代码实现:
```java
public class TicketSeller implements Runnable {
private static int totalTickets = 100; // 总票数
private static int ticketsSold = 0; // 已售票数
private static Object lock = new Object(); // 同步锁
private String name; // 售票点名称
public TicketSeller(String name) {
this.name = name;
}
@Override
public void run() {
while (ticketsSold < totalTickets) {
synchronized (lock) { // 加锁
if (ticketsSold < totalTickets) { // 还有票
ticketsSold++;
System.out.println(name + "售出第" + ticketsSold + "张票");
}
}
try {
Thread.sleep(100); // 模拟售票过程
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Main {
public static void main(String[] args) {
// 创建10个线程模拟10个售票点
for (int i = 1; i <= 10; i++) {
new Thread(new TicketSeller("售票点" + i)).start();
}
}
}
```
在上面的代码中,我们使用了一个静态变量`totalTickets`表示总票数,一个静态变量`ticketsSold`表示已售票数,以及一个静态对象`lock`作为同步锁。每个售票点在售票时都会先尝试获取`lock`的锁,如果获取成功,则判断是否还有票可以卖,如果还有,则售出一张票,并打印出售票信息。最后通过`Thread.sleep(100)`模拟售票过程,即每售出一张票就暂停100毫秒。需要注意的是,加锁之后一定要在合适的位置释放锁,否则会导致其它线程一直阻塞在锁上,无法进行下一步操作。
阅读全文