小问题:在线程中调用sleep()使其睡眠的时候,此线程是否释放所占的资源?

sinboy 2002-07-08 03:07:17
如题
...全文
1767 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
松耦合紧内聚 2002-07-13
  • 打赏
  • 举报
回复
hehe
silentmoon 2002-07-11
  • 打赏
  • 举报
回复
期待更多这类的讨论,能学到东西
webwing 2002-07-11
  • 打赏
  • 举报
回复
up
sinboy 2002-07-10
  • 打赏
  • 举报
回复
讨论此问题是因为我遇到这样一个问题,程序伪码如下:

public class MyPrograme{

...

public static void main(String[] args)
{
new thread1().start();
new thread2().start();
new thread3().start();
}
}
*************

public class thread1 extends Thread{

}
*************

public class thread2 extends Thread{

}
****************

public class thread2 extends Thread{

...

public void run()
{
while(true)
{
try{sleep(TIME);}catch(IOException e){}
...
}
}
}

此程序是实现移动目标和数据处理中心的通信。
其中thread1,thread2来实现和数据处理中心的通信,thread3来实现对连接在计算机串口上的无线数据猫的操作,用数据猫来向移动目标发送短消息和接受从移动目标发来的短消息。
在线程3中,如果TIME为100时,程序正在执行的时候可能耗尽资源而毫无征兆的不再运行,停止了。这个停止还不是所谓的正常的停止,或者异常使程序结束了,编译器显示的是程序正在执行,但是本应该继续输出结果的,却不再输出。但如果是把TIME 设置为1000时,程序就一切正常,即使运行很长时间也不会有问题。
苏格拉顶777 2002-07-09
  • 打赏
  • 举报
回复
还有一个问题,线程有很多地方对资源的访问是需要注意的,特别是访问内存对象的同步问题。这些问题难道不是线程问题的关键?没有技术含量吗?
苏格拉顶777 2002-07-09
  • 打赏
  • 举报
回复
qxjavajava(射手座)

如果非要说作为一个初学者,那么就更应该明白资源这个概念,CPU时间当然是一种资源,但是,内存、你打开的Socket,占用的端口,得到的对象handle,打开的文件,打开的流这些都不是资源?你的线程在sleep的时候把这些资源都释放了,那么sleep完了怎么办?crm2000(浏览器) 说的对。线程在sleep的时候占不占cpu资源对你有什么意义?关键是它什么也不干,包括不释放其它资源。我不认为内存对于初学者不重要,比如说一个对象不new一个新的handle出来,也就是说不为它创造实例(其实就是分配内存),那么你可以使用?这不是内存是什么?难道Vector a=new Vector(); ... ; a=null; ... ; a.all(b);这样的错误操作和内存没有关系?
levinling 2002-07-09
  • 打赏
  • 举报
回复
关注
chl 2002-07-09
  • 打赏
  • 举报
回复
我不认为它会被调出内存,一个在运行的程序难道它会把它所需的资源写进硬盘?即使是也不会是线程这些小资源,而且,线程并没有被序列化——也没有这样的必要。
chl 2002-07-09
  • 打赏
  • 举报
回复
释放cpu,在它睡觉的这段时间里,不加入线程的运行竞争当中,当然,内存是不会释放的,因为它没有被gc,仍旧处于可运行状态。
凌波微搏 2002-07-09
  • 打赏
  • 举报
回复
仅仅是暂时的睡觉嘛,哎,真不理解你是怎么想的.
qxjavajava 2002-07-09
  • 打赏
  • 举报
回复
忘了上贴
to knfy(苏格拉顶)
学术讨论而已
qxjavajava 2002-07-09
  • 打赏
  • 举报
回复
除了new 外,你能很好的控制内存吗?控制个给我看看。。。。。
同步问题能让你对内存偷偷的干什么?你能做得充其量就是优化。
另外,不要用同步唬人。同步不是为了内存对象。同步的最终目的是充分利用cpu资源。你得好好看书。
cpu,和内存那个更值钱呢?你可你多家几个内存条。当然你也可以多家几个cpu。
最好不要用扇热不好的。
tracter 2002-07-09
  • 打赏
  • 举报
回复
一个线程sleep以后,所占的内存资源不会释放,但不会占用CPU资源。
因为,内存资源中保存着这个线程的上下文,如果这些内存资源被释放,那么这个线程就无法再次被恢复(唤醒)。
线程是被外界唤醒的,因此线程在sleep时,完全不占用CPU资源。

至于所占用的内存资源是否被放到硬盘,取决于操作系统的内存调度,而不是由JVM控制的。
pzl686 2002-07-09
  • 打赏
  • 举报
回复
up,
cloudwindbase 2002-07-08
  • 打赏
  • 举报
回复
当然没有释放,不过不驻内存,而是暂时调出内存,醒来后又调回内存,继续运行.
sinboy 2002-07-08
  • 打赏
  • 举报
回复
把问题讨论清楚,以免大家走弯路。我是一个JAVA初学者,希望能看到各位的高见。
sinboy 2002-07-08
  • 打赏
  • 举报
回复
我觉得 qxjavajava(射手座)说的比较有道理,不过大家好象有不同的意见。欢迎跟贴
qxjavajava 2002-07-08
  • 打赏
  • 举报
回复
在线程的问题中,我想大家关心的是cpu的利用问题。和它的schedul time 问题。这是问题的关键。是有技术含量的问题。
不是内存是否被释放的问题。这是跑题。
内存是否被释放的问题是一个java初学者该了解的东西。也是初学者不用去理会的东西。
内存是否被释放的问题应该由garbage collection 来解决(事实上这是自动的).
crm2000 2002-07-08
  • 打赏
  • 举报
回复
当然不释放啦,如果释放了,sleep后我要接着用咋办?
qxjavajava 2002-07-08
  • 打赏
  • 举报
回复
to yangtian(扬天一啸)
不懂就不要瞎讲。你难道看不懂英文?我不认为内存比cpu 更值得关注。
“只是让它暂时休息,需要时激活“------这句话也是错的。
对于sleep()方法而言,不是时间到了线程就会继续执行的,
”when the thread has finished sleeping ,it does not continue execution.As you would expect.it enters the Ready state and will only execute when the thread scheduler allows it to do so .----用不用我告诉你什么是the Ready state ?
加载更多回复(6)

62,614

社区成员

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

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