黑马程序员技术交流社区

标题: (售票程序)多个线程只有Thread-0在运行!为什么 [打印本页]

作者: 吴光新    时间: 2013-6-3 05:09
标题: (售票程序)多个线程只有Thread-0在运行!为什么
本帖最后由 Jiewin 于 2013-6-4 22:58 编辑
  1. class Ticket implements Runnable
  2. {
  3. private int tick = 10000; //设置票数。
  4. public void run()
  5. {
  6. while(true)
  7. {show();}
  8. }
  9. public synchronized void show()
  10. {
  11. if(tick>0)
  12. {
  13. try{Thread.sleep(10);}catch(Exception e){}
  14. String aa = Thread.currentThread().getName();
  15. System.out.println(aa+" "+tick--);
  16. }
  17. }
  18. }

  19. class ThisLockDemo
  20. {
  21. public static void main(String[] args)
  22. {
  23. Ticket t = new Ticket();
  24. Thread t1 = new Thread(t);
  25. Thread t2 = new Thread(t);
  26. Thread t3 = new Thread(t);
  27. Thread t4 = new Thread(t);
  28. t1.start();
  29. t2.start();
  30. t3.start();
  31. t4.start();
  32. }
  33. }
复制代码
此程序就是老师讲到多线程的同步函数时所讲解的例子,老师执行时4个线程都运行了,但为什么我的运行的只有1个线程?老师说如果是多核CPU,可能会出现这样问题,但把票数设置高点就行,老师的设置1000,就有多线程出来了,但我都设置10000了,居然都只有thread-0线程在运行,我完全看不出代码哪里有错!请大家看看问题在哪里!

作者: 火之意志    时间: 2013-6-3 07:01
这个程序没有问题,你在尝试重新运行一下,我的运行结果是正常的,四个线程都会出现
作者: 吴光新    时间: 2013-6-3 07:16
火之意志 发表于 2013-6-3 07:01
这个程序没有问题,你在尝试重新运行一下,我的运行结果是正常的,四个线程都会出现 ...





太郁闷了,不知道是不是我电脑的问题,连死锁都无法锁上,虽然老师说每台机器都不一样,但我没有一次锁上的!

class Test implements Runnable
{
private boolean flag;
Test(boolean flag)
{
  this.flag = flag;
}
public void run()
{
  if(flag)
  {
   //while(true)
   //{
    synchronized(MyLock.locka)
    {
     System.out.println("if locka");
     synchronized(MyLock.lockb)
     {
      System.out.println("if lockb");
     }
    }
   //}
  }
  else
  {
   //while(true)
   //{
    synchronized(MyLock.lockb)
    {
     System.out.println("else lockb");
     synchronized(MyLock.locka)
     {
      System.out.println("else locka");
     }
    }
   //}
  }
}
}
class MyLock
{
static Object locka = new Object();
static Object lockb = new Object();
}
class DeadLockTest
{
public static void main(String[] args)
{
  Thread t1 = new Thread(new Test(true));
  Thread t2 = new Thread(new Test(false));
  t1.start();
  t2.start();
}
}

作者: 火之意志    时间: 2013-6-3 07:19
多尝试几次,可以再改动一下票数,话说你cpu是几盒的?
作者: 吴光新    时间: 2013-6-3 18:21
火之意志 发表于 2013-6-3 07:19
多尝试几次,可以再改动一下票数,话说你cpu是几盒的?

CPU E31230
作者: 金辉    时间: 2013-6-3 18:45
我以前也遇到这种,把run方法写成
public void run()
{
while(true)
{
    for(int i=0;i<100000;i++){}        //记得这个好像叫费时操作还是什么,它可以延缓线程的进入,cpu中执行自然就会慢下来
        show();
}
}
作者: luckwei    时间: 2013-6-3 22:52
应该是你的电脑的问题,程序写的对我的都可以出多线程的。
作者: xiaosuisky    时间: 2013-6-3 23:10
我的也可以多个线程同时执行的。要不你换个软件试试,EclitPlus或者eclipse试试。
或者说你的命令行输出的线程不全,只有299行的。看看它在运行过程中的输出结果是不是四个线程的。
作者: 曹睿翔    时间: 2013-6-4 08:43
看你发了好几个相关的,建议先学着,等基础学完用eclipse测试,效果就出来了
问题解决的话,就再次编辑,改为已解决




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2