5各类,都继承自Thread,但互相之间没有任何关系。我用主类中的方法启动它们。跟踪的结果发现ThreadGroup中一共有5个Thread,依次是Thread_1,Thread_2,Thread_3,Thread_4,Thread_5,用getState()获得的状态都是Runable,优先级都是5,但是,除了Thread_5以外,其它的Thread始终无法获得CPU时间片,感觉成了单线程了啊。不想这样的。
这个有什么办法分析或者跟踪下那?

解决方案 »

  1.   

    问题是:
    其它的线程就没有获得时间片啊。
    Thread_5是一个处理消息的线程,所以由一个while(true)作为主体。但我在里面已经放了个sleep(500)进去,可是其它的线程仍然不能获得CPU时间片。
      

  2.   

    在每个线程里打印一点东西就知道是不是真的没有获得cpu了
      

  3.   

    回复人:anod() ( 二级(初级)) 信誉:93  2007-6-3 0:50:49  得分:0
    ?  问题是:
    其它的线程就没有获得时间片啊。
    Thread_5是一个处理消息的线程,所以由一个while(true)作为主体。但我在里面已经放了个sleep(500)进去,可是其它的线程仍然不能获得CPU时间片。---------------------
    一个线程有sleep后,其他线程是肯定能获得时间片的.除非你只启动了这么一个线程
     回复人:anod() ( 二级(初级)) 信誉:93  2007-6-3 1:57:41  得分:0
    ?  是一个软件的一部分,好多......
    能不能指个方向,我再跟踪试试看...............
    --------------------------------------------------
    把程序里面注释到只保留线程相关的代码,试试..成功再加其他代码,分批试.
      

  4.   

    public class ThreadTest
    {
    public static void main(String[] args)
    {
    Thread_1 th_1 = new Thread_1();
    th_1.start(); 

    Thread_2 th_2 = new Thread_2();
    th_2.start();

    Thread_3 th_3 = new Thread_3();
    th_3.start(); 

    Thread_4 th_4 = new Thread_4();
    th_4.start();

    Thread_5 th_5 = new Thread_5();
    th_5.start(); 
    }
    }class Thread_1 extends Thread
    {
    public void run()
    {
    while(true)
    System.out.println(getName());
    }
    } class Thread_2 extends Thread
    {
    public void run()
    {
    while(true)
    System.out.println(getName());
    }
    }class Thread_3 extends Thread
    {
    public void run()
    {
    while(true)
    System.out.println(getName());
    }
    }class Thread_4 extends Thread
    {
    public void run()
    {
    while(true)
    System.out.println(getName());
    }
    }class Thread_5 extends Thread
    {
    public void run()
    {
    while(true)
    System.out.println(getName());
    }
    }5个线成 全运行了呀
      

  5.   

    个人感觉和while (true) { ... }有关系, 当条件为真的时候别的线程不能运行吧.
      

  6.   

    while(true){Sleep(1000);
    }WHILE的时候一定要加SLEEP,不然会在一个线程上耗死资源的
      

  7.   

    楼上正解,如果不sleep,你会进入死循环,资源耗死在一个线程上(正如楼上所说),其它线程得不到资源了
      

  8.   

    while(true){Sleep(1000);
    }windows下分配cpu片好像是每个线程都有机会去运行了
      

  9.   

    严重的错误!!!
    认为必须加sleep的(象下面),可错得很严重啊。如果必须加sleep的话,那还要vm调度线程干嘛啊。
    while(true){
    ......
    Sleep(1000);
    }
    我写了个简单的测试贴在下面,验证一个问题:不用sleep线程仍然可以调度。
    当然,我的问题还是没有解决,正在查原因,象supernpc说的那样,谢谢他。不过希望他不要真的是NPC:-).....package test;public class TestThread
    {
    public static void main(String[] args)
    {
    new T1().start();
    new T2().start();
    new T3().start();
    }
    }class T1 extends Thread
    {
    public void run()
    {
    while (true)
    {
    System.out.print("11111111111\n");
    }
    }
    }class T2 extends Thread
    {
    public void run()
    {
    while (true)
    {
    System.out.print("22222222222\n");
    }
    }
    }class T3 extends Thread
    {
    public void run()
    {
    while (true)
    {
    System.out.print("33333333333\n");
    }
    }
    }
      

  10.   

    问题找到了。
    所谓“未分配到CPU时间片的线程”其实不是真的。真实情况是:
    在这个线程的run()里面调用了一个InputStream的read(),而这个read()是阻塞的,所以造成了没有分配到CPU时间片的假象,其实是被阻塞了。
    此时如果查看所有线程的状态,这个线程是“RUNABLE”,这一点开始也让我很迷惑。
    主要原因,还是自己学艺不精,真是汗啊。
    再次谢过大家了。