老码请进,JAVA,关于买票。。。。

  • c
    crc8
    如图所示,假设我用两个线程卖票。调试过程中,因为我是菜鸟且是初学。我想知道是不是两个线程都有在卖票。。。如果我将票数设置的太小100或1000这样的,永远就只有一个线程在卖。。。我估计是我电脑运算太快的原因,所以我就只设置票数是10000或100万这样的。。。运行过程确实看到两个线程在闪卖啦。
    但我想要的是:我票数是50或100或5的时候,如何也是多线程在卖呢?











    1. class A extends Thread
    2. {
    3. public static int tickets = 50000;
    4. public static String str = new String("lock");

    5. public void run()
    6. {
    7. while (true)
    8. {
    9. synchronized (str)
    10. {
    11. if (tickets > 0)
    12. {
    13. System.out.printf("%s线程正在卖出第%d张票\n", Thread.currentThread().getName(),tickets);
    14. --tickets;
    15. }
    16. else
    17. {
    18. break;
    19. }
    20. }
    21. }
    22. }
    23. }

    24. public class TestTickets_3
    25. {
    26. public static void main(String[] args)
    27. {
    28. A aa1 = new A();
    29. aa1.start();

    30. A aa2 = new A();
    31. aa2.start();
    32. }
    33. }
    复制代码
  • w
    wenxisyt
    建议你看下并行方面的知识、线程同步与通讯等
  • a
    antonychan
    它会一直2线程再卖啦。。。。为何你会认为只有一个线程在卖呢。。。
    另外操作对象的时候需要锁一下,否则有可能多线程都处理了同一个数据(卖了同一张票)
  • c
    crc8
    按逻辑应该是两个线程在卖,我只是想 我在调试的时候, 测试票数不想设置得太大。想设置到小点也可以看到多线程在卖。。这样方便调试啊。
  • 唐浪
    加个延时?
  • a
    antonychan
    回复4#crc8


    每个循环加个随机线程sleep
    另外这种死循环最好都要加sleep,否则可能会发生你意想不到的问题。。哈
  • x
    xx6412223
    我来正经回答一下,你代码没问题,中间要sleep一下,模拟卖票业务。
    或者你用一个值为2的countdownlatch 在while循环后开启
  • v
    very20027501
    线程会把CPU分配的时间片跑完了才切换,除非你强制让他提前休息--调用sleep
  • k
    kevincai100
    在后面加个 sleep ,或者用公平锁
  • c
    crc8
    回复6#antonychan

    谢谢各位老码,睡一会再卖确实可以看到多线程的效果了。。。哈哈。