当前位置:   article > 正文

java多线程简单模拟12306抢票_java抢票实现思路

java抢票实现思路

简单就是很简单模拟一下...(简单也写了好久..synchronized使用的位置真的很重要..)

业务描述
   假设有200张票,用4个线程去订票,不能有两个或者以上的线程订到了
   同一个票(原因就不说了),当最后一张票卖掉的时候结束,再订就抛
   异常提示出票卖完了。

业务分析,要实现以上功能,

   1、需要创建一个车票类,初始化票,卖票的接口saleTicket()

   2、自定义异常的一个类。

   3、创建卖票线程类,在run方法中卖车票。

   4、初始化车票的线程,负责初始化车票,也就是初始化Ticket类中的数组。

   5、创建主方法进行测试。

测试类

  1. package test12306;
  2. /*
  3. java多线程模拟实现12306售票
  4. 业务描述
  5. 假设有200张票,用4个线程去订票,不能有两个或者以上的线程订到了
  6. 同一个票(原因就不说了),当最后一张票卖掉的时候结束,再订就抛
  7. 异常提示出票卖完了。
  8. 业务分析,要实现以上功能,
  9. 1、需要创建一个车票类,初始化票,卖票的接口saleTicket()
  10. 2、自定义异常的一个类。
  11. 3、创建卖票线程类,在run方法中卖车票。
  12. 4、初始化车票的线程,负责初始化车票,也就是初始化Ticket类中的数组。
  13. 5、创建主方法进行测试。
  14. */
  15. public class Test011 {
  16. public static void main(String[] args) {
  17. Ticket[] tickets = new Ticket[200];
  18. FormatTickets f = new FormatTickets(tickets);
  19. Thread t1 = new SaleTicketThread(f);
  20. Thread t2 = new SaleTicketThread(f);
  21. Thread t3 = new SaleTicketThread(f);
  22. Thread t4 = new SaleTicketThread(f);
  23. t1.setName("一号卖票线程");
  24. t2.setName("二号卖票线程");
  25. t3.setName("三号卖票线程");
  26. t4.setName("四号卖票线程");
  27. f.start();
  28. try {
  29. f.join();
  30. } catch (InterruptedException e) {
  31. e.printStackTrace();
  32. }
  33. t1.start();
  34. t2.start();
  35. t3.start();
  36. t4.start();
  37. }
  38. }

 

车票类

  1. package test12306;
  2. public class Ticket {
  3. private double price;
  4. private String station;
  5. public Ticket() {
  6. }
  7. public Ticket(double price, String station) {
  8. this.price = price;
  9. this.station = station;
  10. }
  11. public double getPrice() {
  12. return price;
  13. }
  14. public void setPrice(double price) {
  15. this.price = price;
  16. }
  17. public String getStation() {
  18. return station;
  19. }
  20. public void setStation(String station) {
  21. this.station = station;
  22. }
  23. public String toString() {
  24. return "Ticket{" +
  25. "price=" + price +
  26. ", station='" + station + '\'' +
  27. '}';
  28. }
  29. }

 自定义异常类

  1. package test12306;
  2. public class MyException extends Exception{
  3. public MyException(){}
  4. public MyException(String s){
  5. super(s);
  6. }
  7. }

卖票线程类

  1. package test12306;
  2. import com.sun.deploy.security.SelectableSecurityManager;
  3. public class SaleTicketThread extends Thread implements SaleTicket{
  4. FormatTickets f;
  5. public SaleTicketThread(FormatTickets f) {
  6. this.f = f;
  7. }
  8. public void run() {
  9. while (f.i < 200) {
  10. synchronized (f) {
  11. saleTicket();
  12. }
  13. }
  14. }
  15. public void saleTicket() {
  16. if (f.tickets[199] != null){
  17. System.out.println(Thread.currentThread().getName() + "卖出" + f.tickets[f.i]);
  18. f.tickets[f.i] = null;
  19. f.i ++;
  20. }else {
  21. try {
  22. throw new MyException("票卖完了");
  23. } catch (MyException e) {
  24. System.out.println(e.getMessage());
  25. }
  26. }
  27. }
  28. }

初始化车票线程类

  1. package test12306;
  2. import java.util.Arrays;
  3. public class FormatTickets extends Thread{
  4. Ticket[] tickets;
  5. int i = 0;
  6. public FormatTickets(Ticket[] tickets) {
  7. this.tickets = tickets;
  8. }
  9. public void run(){
  10. for (int i = 0; i < tickets.length; i ++){
  11. tickets[i] = new Ticket(i,"大连站" + i);
  12. }
  13. }
  14. }

 

还有个小接口..

  1. package test12306;
  2. public interface SaleTicket {
  3. public void saleTicket();
  4. }

 

输出结果分布很均匀,甚至有时候只有两个线程抢票了,不知道为什么,有没有大佬帮我看看...

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/632106
推荐阅读
相关标签
  

闽ICP备14008679号