赞
踩
简单就是很简单模拟一下...(简单也写了好久..synchronized使用的位置真的很重要..)
业务描述 假设有200张票,用4个线程去订票,不能有两个或者以上的线程订到了 同一个票(原因就不说了),当最后一张票卖掉的时候结束,再订就抛 异常提示出票卖完了。 业务分析,要实现以上功能, 1、需要创建一个车票类,初始化票,卖票的接口saleTicket() 2、自定义异常的一个类。 3、创建卖票线程类,在run方法中卖车票。 4、初始化车票的线程,负责初始化车票,也就是初始化Ticket类中的数组。 5、创建主方法进行测试。
测试类
- package test12306;
-
- /*
- java多线程模拟实现12306售票
-
- 业务描述
- 假设有200张票,用4个线程去订票,不能有两个或者以上的线程订到了
- 同一个票(原因就不说了),当最后一张票卖掉的时候结束,再订就抛
- 异常提示出票卖完了。
-
- 业务分析,要实现以上功能,
-
- 1、需要创建一个车票类,初始化票,卖票的接口saleTicket()
-
- 2、自定义异常的一个类。
-
- 3、创建卖票线程类,在run方法中卖车票。
-
- 4、初始化车票的线程,负责初始化车票,也就是初始化Ticket类中的数组。
-
- 5、创建主方法进行测试。
- */
- public class Test011 {
- public static void main(String[] args) {
- Ticket[] tickets = new Ticket[200];
- FormatTickets f = new FormatTickets(tickets);
- Thread t1 = new SaleTicketThread(f);
- Thread t2 = new SaleTicketThread(f);
- Thread t3 = new SaleTicketThread(f);
- Thread t4 = new SaleTicketThread(f);
- t1.setName("一号卖票线程");
- t2.setName("二号卖票线程");
- t3.setName("三号卖票线程");
- t4.setName("四号卖票线程");
- f.start();
- try {
- f.join();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- t1.start();
- t2.start();
- t3.start();
- t4.start();
-
- }
- }
车票类
- package test12306;
-
- public class Ticket {
- private double price;
- private String station;
-
- public Ticket() {
- }
-
- public Ticket(double price, String station) {
- this.price = price;
- this.station = station;
- }
-
- public double getPrice() {
- return price;
- }
-
- public void setPrice(double price) {
- this.price = price;
- }
-
- public String getStation() {
- return station;
- }
-
- public void setStation(String station) {
- this.station = station;
- }
-
- public String toString() {
- return "Ticket{" +
- "price=" + price +
- ", station='" + station + '\'' +
- '}';
- }
- }
自定义异常类
- package test12306;
-
- public class MyException extends Exception{
- public MyException(){}
- public MyException(String s){
- super(s);
- }
- }
卖票线程类
- package test12306;
-
- import com.sun.deploy.security.SelectableSecurityManager;
-
- public class SaleTicketThread extends Thread implements SaleTicket{
- FormatTickets f;
- public SaleTicketThread(FormatTickets f) {
- this.f = f;
- }
-
- public void run() {
- while (f.i < 200) {
- synchronized (f) {
- saleTicket();
- }
- }
- }
-
- public void saleTicket() {
- if (f.tickets[199] != null){
- System.out.println(Thread.currentThread().getName() + "卖出" + f.tickets[f.i]);
- f.tickets[f.i] = null;
- f.i ++;
- }else {
- try {
- throw new MyException("票卖完了");
- } catch (MyException e) {
- System.out.println(e.getMessage());
- }
- }
- }
- }
初始化车票线程类
- package test12306;
-
- import java.util.Arrays;
-
- public class FormatTickets extends Thread{
- Ticket[] tickets;
- int i = 0;
- public FormatTickets(Ticket[] tickets) {
- this.tickets = tickets;
- }
-
- public void run(){
- for (int i = 0; i < tickets.length; i ++){
- tickets[i] = new Ticket(i,"大连站" + i);
- }
- }
-
- }
还有个小接口..
- package test12306;
-
- public interface SaleTicket {
- public void saleTicket();
- }
输出结果分布很均匀,甚至有时候只有两个线程抢票了,不知道为什么,有没有大佬帮我看看...
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。