日期:2014-05-20  浏览次数:20744 次

请教一个java线程的问题
首先有个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的线程机制就是这样的吗?
问题非常急,谢谢,分数不够,可以尽管提

------解决方案--------------------
A thread is alive if it has been started and has not yet died.
线程已经死掉了,当然不能执行
------解决方案--------------------
应该是一个Thread对象只可以启动一次

------解决方案--------------------
polarman(北极人http://blog.csdn.net/polarman)

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


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

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




------解决方案--------------------
不知道局部变量能不能满足lz的要求

while(true)
{
Thread down=new Thread();//将Thread换成你自己的线程
if(!down.isAlive())
{
System.out.println( "begin ");
down.start();
}
Sleep();//里面实现了,睡眠1秒中的功能
}

------解决方案--------------------
public void run() 

while(true) 

if(!down.isAlive()) 

System.out.println("begin"); 
down = new DownThread(); //new a thread again
down.start(); 

Sleep();//里面实现了,睡眠1秒中的功能 



------解决方案--------------------
线程在sleep的时候没有被释放,只是等待一段时间
start()方法只是运行一次,多次调用没有效果吧
一个线程的run()方法执行完以后,或者return出来以后,这个线程就中止了

所以要重新启动一个线程,应该是new一个新的线程
------解决方案--------------------
原来那个对象虽然还在,但是由于没有其他引用引用这个对象,所以在下一次垃圾回收的时候,应该会被系统回收掉的,所以也没什么不爽的。

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

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

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


------解决方案--------------------
我现在为了实现我原先的功能,没用down.start()这个语句了,直接用down.run()这么调用了。 


我以前4过了,如果你直接用down.run()你顶多属于调用方法,不能算是个线程,好象要实现线程必须调用down.start()