请教一个java线程的问题

shunan 2007-09-28 11:22:27
首先有个mainthread,它的run函数是这样的:
public void run()
{
while(true)
{
if(!down.isAlive())
{
System.out.println("begin");
down.start();
}
Sleep();//里面实现了,睡眠1秒中的功能
}
}
down对象也是一个线程,它的run函数会输出一个字符串,然后结束

实际运行结果:
第一次while循环时,begin和down对象里的run函数里的信息都会输出
之后的每次while循环只输出begin字符串(说明mainthread的while(true)一直在运行的,而且也进入到if语句中去了),但是没运行到down的run函数里
不知道怎么回事?java的线程机制就是这样的吗?
问题非常急,谢谢,分数不够,可以尽管提
...全文
306 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiangfeidecainiao 2007-09-30
  • 打赏
  • 举报
回复
我现在为了实现我原先的功能,没用down.start()这个语句了,直接用down.run()这么调用了。


我以前4过了,如果你直接用down.run()你顶多属于调用方法,不能算是个线程,好象要实现线程必须调用down.start()
qybao 2007-09-29
  • 打赏
  • 举报
回复
public void run()
{
while(true)
{
if(!down.isAlive())
{
System.out.println("begin");
down = new DownThread(); //new a thread again
down.start();
}
Sleep();//里面实现了,睡眠1秒中的功能
}
}
shunan 2007-09-29
  • 打赏
  • 举报
回复
to:sszhangy
to:qybao
谢谢2位,我现在就是按照qybao的方法做的,但是总觉得原来那个对象还在的,但是却没法让它再运行一次,有的不爽,^_^

另外再顺便问一下:线程在被sleep,或者interuupt之后,cpu资源应该是释放了,其他资源应该还在的哦?是这么理解吗?
qybao 2007-09-29
  • 打赏
  • 举报
回复
原来那个对象虽然还在,但是由于没有其他引用引用这个对象,所以在下一次垃圾回收的时候,应该会被系统回收掉的,所以也没什么不爽的。

sleep是让线程睡眠,也就是不占用cpu时间,interrupt是给线程发终止信号,线程收到后就中断停止,占有的资源都会释放

LZ所指的占有资源是什么?是共享内存资源吗?如果一开始线程不用synchronized锁住共享内存资源,那么就不存在释放不释放的问题。每个线程都有自己独立的栈,也就是threadlocal,线程会把共享资源复制一个到自己的栈中,所以如果不锁住资源,就不会存在释放资源一说。

如果LZ所说的释放资源是指垃圾回收,那就要看在线程外是否还有引用在引用该线程所创建的对象。

beiouwolf 2007-09-29
  • 打赏
  • 举报
回复
线程在sleep的时候没有被释放,只是等待一段时间
start()方法只是运行一次,多次调用没有效果吧
一个线程的run()方法执行完以后,或者return出来以后,这个线程就中止了

所以要重新启动一个线程,应该是new一个新的线程
xiangfeidecainiao 2007-09-28
  • 打赏
  • 举报
回复
polarman(北极人http://blog.csdn.net/polarman)

应该是一个Thread对象只可以启动一次


应该就是polarman不是说的,线程已经启动了,在掉多少次启动都没用了

你可以44,在睡眠后 停掉 down 线程,看有没有打印就好了



polarman 2007-09-28
  • 打赏
  • 举报
回复
应该是一个Thread对象只可以启动一次
empireconquer 2007-09-28
  • 打赏
  • 举报
回复
A thread is alive if it has been started and has not yet died.
线程已经死掉了,当然不能执行
sszhangy 2007-09-28
  • 打赏
  • 举报
回复
不知道局部变量能不能满足lz的要求

while(true)
{
Thread down=new Thread();//将Thread换成你自己的线程
if(!down.isAlive())
{
System.out.println("begin");
down.start();
}
Sleep();//里面实现了,睡眠1秒中的功能
}
shunan 2007-09-28
  • 打赏
  • 举报
回复
但是用down.run()这么调用也不行,这就当成是一个函数调用,没有线程的含义了,down.run不运行完,mainthread就不往下运行了。怎么样才能让线程not alive后,还能启动呢?
shunan 2007-09-28
  • 打赏
  • 举报
回复
to:empireconquer() ,polarman(北极人http://blog.csdn.net/polarman),
xiangfeidecainiao()
按照各位的理解可以解释通,这样的话,要保持一个线程的一直能够运行(不一定要一直运行着,运行一会儿,休息下还能运行),就不能让run函数运行完毕了,只能让它睡眠或者wait等等了?如果run函数运行结束,也就是说这个线程没价值了?
我现在为了实现我原先的功能,没用down.start()这个语句了,直接用down.run()这么调用了。
再次谢谢各位

62,623

社区成员

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

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