用java语言写:用两个线程模拟存票,售票过程。假设开始售票处并没有票,一个线程往里存票,另一个线程则往外卖票。新建一个票类对象,让存票和售票线程都访问它。本例采用两个线程共享一个数据对象来实现对同一份数据的操作。
时间: 2023-09-08 19:04:19 浏览: 302
模拟售票系统java编程.doc
### 回答1:
以下是Java语言的代码实现:
```java
public class Ticket {
private int count = 0; // 售票处初始没有票
public synchronized void addTicket() { // 存票方法
while (count != 0) { // 当前已有票时,等待售票线程售出票
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
count++; // 存入一张票
System.out.println("存票成功,当前票数:" + count);
notifyAll(); // 唤醒正在等待的售票线程
}
public synchronized void sellTicket() { // 售票方法
while (count == 0) { // 当前没有票时,等待存票线程存入票
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
count--; // 卖出一张票
System.out.println("售票成功,当前票数:" + count);
notifyAll(); // 唤醒正在等待的存票线程
}
}
public class StoreTicketThread implements Runnable {
private Ticket ticket;
public StoreTicketThread(Ticket ticket) {
this.ticket = ticket;
}
@Override
public void run() {
while (true) { // 不断地存票
ticket.addTicket();
try {
Thread.sleep(1000); // 模拟存票过程
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class SellTicketThread implements Runnable {
private Ticket ticket;
public SellTicketThread(Ticket ticket) {
this.ticket = ticket;
}
@Override
public void run() {
while (true) { // 不断地售票
ticket.sellTicket();
try {
Thread.sleep(1500); // 模拟售票过程
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Test {
public static void main(String[] args) {
Ticket ticket = new Ticket();
StoreTicketThread storeThread = new StoreTicketThread(ticket);
SellTicketThread sellThread = new SellTicketThread(ticket);
Thread thread1 = new Thread(storeThread); // 存票线程
Thread thread2 = new Thread(sellThread); // 售票线程
thread1.start();
thread2.start();
}
}
```
在这个例子中,我们定义了一个Ticket类来模拟售票过程,其中包含了存票和售票两个方法,并使用synchronized关键字实现了线程间同步。我们新建了一个存票线程和一个售票线程,分别调用Ticket类中的存票和售票方法,模拟存票和售票过程。最后在main方法中启动这两个线程即可。
### 回答2:
在Java语言中,可以使用线程来模拟存票和售票的过程。首先,我们创建一个票类对象,表示一张票,该对象包含票号等属性。
```java
public class Ticket {
private int ticketNumber;
public Ticket(int ticketNumber) {
this.ticketNumber = ticketNumber;
}
public int getTicketNumber() {
return ticketNumber;
}
}
```
接下来,我们创建两个线程,一个线程用于存票,另一个线程用于售票。这两个线程共享一个数据对象,即票类对象,来实现对同一份数据的操作。由于存票和售票过程是同时进行的,我们需要使用锁来保证线程安全。
```java
public class TicketStore {
public static void main(String[] args) {
Ticket ticket = new Ticket(-1); // 初始票号为-1,表示开始售票处没有票
// 存票线程
Thread storageThread = new Thread(() -> {
synchronized (ticket) {
try {
while (ticket.getTicketNumber() < 10) { // 存满10张票
ticket.wait();
}
ticket.notifyAll();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
// 售票线程
Thread sellingThread = new Thread(() -> {
synchronized (ticket) {
try {
while (ticket.getTicketNumber() < 10) { // 售完10张票
ticket.wait();
}
ticket.notifyAll();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
storageThread.start();
sellingThread.start();
}
}
```
在存票线程中,首先使用synchronized关键字锁住票类对象,然后使用while循环判断票号是否小于10,如果是,则等待售票线程售完票后唤醒存票线程。在唤醒前使用`ticket.wait()`方法将存票线程挂起,释放锁。在售票线程中,也是同样的逻辑。
这样,就实现了两个线程模拟存票和售票的过程。两个线程共享一个数据对象,并使用锁来保证线程安全。
### 回答3:
可以使用Java的多线程来模拟存票和售票过程。首先,我们可以创建一个票类对象,用来表示票的数量。
```java
public class Ticket {
private int count;
public Ticket() {
count = 0;
}
public synchronized void storeTicket() {
count++;
System.out.println("存票成功,当前票数为:" + count);
}
public synchronized void sellTicket() {
if(count > 0) {
count--;
System.out.println("售票成功,当前票数为:" + count);
} else {
System.out.println("票已售罄");
}
}
}
```
然后我们创建两个线程,一个用来存票,一个用来售票。这两个线程共享同一个票类对象。
```java
public class Main {
public static void main(String[] args) {
Ticket ticket = new Ticket();
Thread storeThread = new Thread(new Runnable() {
public void run() {
while(true) {
ticket.storeTicket();
try {
Thread.sleep(1000); // 模拟存票过程
} catch (InterruptedException e) {
e.printStackTrace();
}
})
}
});
Thread sellThread = new Thread(new Runnable() {
public void run() {
while(true) {
ticket.sellTicket();
try {
Thread.sleep(1000); // 模拟售票过程
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
storeThread.start();
sellThread.start();
}
}
```
在存票线程和售票线程的run方法中,通过调用Ticket类对象的storeTicket方法和sellTicket方法来模拟存票和售票的过程。
需要注意的是,存票和售票的方法都使用了synchronized关键字修饰,这样可以确保在同一时间只有一个线程能够访问这些方法,避免数据竞争。
通过以上代码,我们就可以用两个线程模拟存票和售票的过程。每次存票之后,都会打印当前票数;每次售票之后,如果票已售罄,则会打印"票已售罄"的提示信息。
阅读全文