咋多线程变成单线程了?

anod 2007-06-02 11:50:03
5各类,都继承自Thread,但互相之间没有任何关系。我用主类中的方法启动它们。跟踪的结果发现ThreadGroup中一共有5个Thread,依次是Thread_1,Thread_2,Thread_3,Thread_4,Thread_5,用getState()获得的状态都是Runable,优先级都是5,但是,除了Thread_5以外,其它的Thread始终无法获得CPU时间片,感觉成了单线程了啊。不想这样的。
这个有什么办法分析或者跟踪下那?
...全文
732 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
anod 2007-06-05
  • 打赏
  • 举报
回复
问题找到了。
所谓“未分配到CPU时间片的线程”其实不是真的。真实情况是:
在这个线程的run()里面调用了一个InputStream的read(),而这个read()是阻塞的,所以造成了没有分配到CPU时间片的假象,其实是被阻塞了。
此时如果查看所有线程的状态,这个线程是“RUNABLE”,这一点开始也让我很迷惑。
主要原因,还是自己学艺不精,真是汗啊。
再次谢过大家了。
吴恒 2007-06-04
  • 打赏
  • 举报
回复
while(true){

Sleep(1000);
}

windows下分配cpu片好像是每个线程都有机会去运行了
zhao261319398_26 2007-06-04
  • 打赏
  • 举报
回复
路过!~
davidafairy 2007-06-04
  • 打赏
  • 举报
回复
楼上正解,如果不sleep,你会进入死循环,资源耗死在一个线程上(正如楼上所说),其它线程得不到资源了
beiouwolf 2007-06-04
  • 打赏
  • 举报
回复
while(true){

Sleep(1000);
}

WHILE的时候一定要加SLEEP,不然会在一个线程上耗死资源的
anod 2007-06-04
  • 打赏
  • 举报
回复
严重的错误!!!
认为必须加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");
}
}
}

anod 2007-06-03
  • 打赏
  • 举报
回复
问题是:
其它的线程就没有获得时间片啊。
Thread_5是一个处理消息的线程,所以由一个while(true)作为主体。但我在里面已经放了个sleep(500)进去,可是其它的线程仍然不能获得CPU时间片。
xiangfeidecainiao 2007-06-03
  • 打赏
  • 举报
回复
我来关注了

多线程 也是一个一个运行的

不会一起运行的

anod 2007-06-03
  • 打赏
  • 举报
回复
没人顶我自己顶下,大家来看看啊。关注下也好啊
richard_first 2007-06-03
  • 打赏
  • 举报
回复
系统起动线程是要一定时间的,每个线程做事情的时间长些,就会看到了
Supernpc 2007-06-03
  • 打赏
  • 举报
回复
回复人: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
?

是一个软件的一部分,好多......
能不能指个方向,我再跟踪试试看...............
--------------------------------------------------
把程序里面注释到只保留线程相关的代码,试试..成功再加其他代码,分批试.
believefym 2007-06-03
  • 打赏
  • 举报
回复
在每个线程里打印一点东西就知道是不是真的没有获得cpu了
sl3834009 2007-06-03
  • 打赏
  • 举报
回复
个人感觉和while (true) { ... }有关系, 当条件为真的时候别的线程不能运行吧.
zhangchao0323 2007-06-03
  • 打赏
  • 举报
回复
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个线成 全运行了呀
zhangchao0323 2007-06-03
  • 打赏
  • 举报
回复
能 把代码 贴 出来吗 关注
gongyali2005 2007-06-03
  • 打赏
  • 举报
回复
在每个线程里打印点东西看看
syhan 2007-06-03
  • 打赏
  • 举报
回复
java的线程是与平台有关的~
anod 2007-06-03
  • 打赏
  • 举报
回复
是一个软件的一部分,好多......
能不能指个方向,我再跟踪试试看...............
jackdawson2007 2007-06-03
  • 打赏
  • 举报
回复
能看下你完整的程序么??

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧