当前位置:   article > 正文

java之多线程抢火车票_java多线程抢票

java多线程抢票

一、创建线程的方法是实现runnable,重写run方法,执行线程需要丢入runnable接口实现类,调用start方法

  1. *********************************/
  2. //多个线程同时操作一个类
  3. //火车票
  4. public class TestTread4 implements Runnable{
  5. //票数
  6. private int ticketNums = 10;
  7. @Override
  8. public void run() {
  9. while (true) {
  10. if (ticketNums <= 0) {
  11. break;
  12. }
  13. try {
  14. Thread.sleep(200);
  15. } catch (InterruptedException e) {
  16. e.printStackTrace();
  17. }
  18. System.out.println(Thread.currentThread().getName()+"--->拿到了第"+ticketNums-- +"张票");
  19. }
  20. }
  21. public static void main(String[] args) {
  22. TestTread4 testTread4 = new TestTread4();
  23. new Thread(testTread4, "小明").start();
  24. new Thread(testTread4,"老师").start();
  25. new Thread(testTread4,"黄牛").start();
  26. }
  27. }

发现问题:多个线程操作同一个资源的情况下,线程不安全,数据紊乱.

加上锁就搞定

  1. public class TestTread4 implements Runnable{
  2. //票数
  3. private int ticketNums = 10;
  4. @Override
  5. public synchronized void run() {
  6. while (true) {
  7. if (ticketNums <= 0) {
  8. break;
  9. }
  10. try {
  11. Thread.sleep(200);
  12. } catch (InterruptedException e) {
  13. e.printStackTrace();
  14. }
  15. System.out.println(Thread.currentThread().getName()+"--->拿到了第"+ticketNums-- +"张票");
  16. }
  17. }
  18. public static void main(String[] args) {
  19. TestTread4 testTread4 = new TestTread4();
  20. new Thread(testTread4, "小明").start();
  21. new Thread(testTread4,"老师").start();
  22. new Thread(testTread4,"黄牛").start();
  23. }
  24. }

当有200人抢100张票

  1. public class TicketRunnable implements Runnable {
  2. /**
  3. * 总票数
  4. */
  5. private final int ticketSize = 100;
  6. /**
  7. * 抢票人数
  8. */
  9. private final int peopleSize = 200;
  10. /**
  11. * 票数
  12. */
  13. private int ticketNum;
  14. /**
  15. * 人数
  16. */
  17. private int peopleNum;
  18. @Override
  19. public void run() {
  20. while(ticketNum < ticketSize && peopleNum < peopleSize){
  21. synchronized (this){
  22. if(ticketNum < ticketSize && peopleNum < peopleSize){
  23. if((int)(Math.random() * 20) % 2 == 1){
  24. System.out.println(Thread.currentThread().getName() + "第" + (++peopleNum) + "个人抢到第" + (++ticketNum) + " 张票");
  25. try {
  26. Thread.sleep(100);
  27. }catch (Exception e){
  28. e.printStackTrace();
  29. }
  30. }else {
  31. System.out.println(Thread.currentThread().getName() + "第" + (++peopleNum) + " 个人未抢到票");
  32. }
  33. }
  34. }
  35. }
  36. }
  37. }
  1. public class TestTicket {
  2. public static void main(String[] args) {
  3. TicketRunnable tr = new TicketRunnable();
  4. Thread t1 = new Thread(tr , "窗口A");
  5. Thread t2 = new Thread(tr , "窗口B");
  6. Thread t3 = new Thread(tr , "窗口C");
  7. Thread t4 = new Thread(tr , "窗口D");
  8. t1.start();
  9. t2.start();
  10. t3.start();
  11. t4.start();
  12. }
  13. }

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

闽ICP备14008679号