A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 丘凤光 金牌黑马   /  2013-4-19 16:41  /  2260 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在做一个练习的时候创建线程太多,电脑卡个半死,而且还在不停的创建新线程,同时有很多线程抛出了错误,想问一下
一个线程里抛出了错误,这个线程中的资源是不是全部都释放了呢?如果没有释放,需要怎样回收那些资源呢?
知道的希望能帮解答解答。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

12 个回复

倒序浏览
一个线程里抛出了错误,如果本线程中没有对其进行捕获,那么该线程就会终止了
,也就相当于这个run方法结束了,run方法结束了,当线程的run()方法完成时就认为这个线程已经死去。
这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死亡,就不能复生。
如果在一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
线程里抛出了错误的话,没有进行处理,那么该线程就会停止运行,就相当于该线程结束了,结束了当然就释放资源了。
就像main方法一样,执行完毕就结束了,资源就释放了...

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
何锦权 发表于 2013-4-19 17:17
一个线程里抛出了错误,如果本线程中没有对其进行捕获,那么该线程就会终止了
,也就相当于这个run方法结束 ...

我知道线程结束了,只是不知道线程创建的垃圾会不会自动消失
回复 使用道具 举报
up.yfei 发表于 2013-4-19 17:41
线程里抛出了错误的话,没有进行处理,那么该线程就会停止运行,就相当于该线程结束了,结束了当然就释放资 ...

java.lang.OutOfMemoryError一直运行下去就爆出了这样的错误,这又咋么解析呢?还有一点要说明,主线程一直在运行。
回复 使用道具 举报
你可以用线程池啊
回复 使用道具 举报
我觉得资源一定被回收了,因为这是jvm虚拟机的内存回收机制干的事情。。。
回复 使用道具 举报
伊廷文 发表于 2013-4-19 19:02
你可以用线程池啊

线程池的知识不太懂,能给我举个例子讲讲不?
回复 使用道具 举报
王大斌 发表于 2013-4-19 19:30
我觉得资源一定被回收了,因为这是jvm虚拟机的内存回收机制干的事情。。。 ...

OutOfMemoryError就是没有可用的内存提供给垃圾回收器时异常
那有什么办法解决不?
回复 使用道具 举报
针对你这个问题,我之前一直没有太多时间说说自己的见解,先表示道歉啊
我说说自己的见解吧:
1、上面已经都说了,线程一旦死亡,就不能再复活了,如果还在创建线程,就说明这个对象还是存活的。
2、我们知道,CPU也不是一次都执行好多线程,也是一个一个的执行,每次只能执行一个线程(多核除外)。所以对于创建出来的线程,没执行的都是放在线程池中的。(线程池是存放未执行的线程的一块内存,如果有线程,就不会再创建相同的线程了;其实和字符串池是一样的,我个人认为都是存放在常量池中,这个还有待研究。)
3、如果线程死亡了,是非正常的,就会抛异常,对于这个线程的资源呢?我个人认为,不会立即释放的(否则怎么会电脑卡死呢,因为一直存在内存中没立即释放呗),而是垃圾回收机制在某个时刻会自动释放已经死亡或者不再使用的垃圾的。至于是怎么回收的,建议你了解一下垃圾回收机制:http://bbs.itheima.com/thread-42683-1-1.html
4、主线程也就是main为啥会一直运行呢?这个我觉得是因为这个线程是jvm创建的,并不是你的线程对象创建的,而且抛出的异常都是你创建出的线程对象死亡而抛出的。所以主函数并不受影响啊。
5、对于这种情况,没办法,只能尽快结束你的程序,用任务管理器,或者建议用eclipse中直接结束。
回复 使用道具 举报
黄玉昆 发表于 2013-4-28 11:41
针对你这个问题,我之前一直没有太多时间说说自己的见解,先表示道歉啊
我说说自己的见解吧:
1、上面已经 ...

最近上网不太方便,才回昆哥你,不好意思啦啦啦

你这见解很清晰。我用的是实现Runnable接口,没有用Executors创建线程池,这样开启的线程也会放到线程池中啊?
我那程序是是你上次说的爬虫的改进。查找到网页中的连接,递归开启新线程进入连接继续往深处查找,有时候网页连接错误,那个线程就抛出异常了
回复 使用道具 举报
丘凤光 发表于 2013-4-29 13:10
最近上网不太方便,才回昆哥你,不好意思啦啦啦

你这见解很清晰。我用的是实现Runnable接口,没有用Exec ...

其实你这样查找,很难找到其中的链接的,因为好多都是用网页的一些代码写的,原理我不太清楚的,而且很多数据库是不能随便访问的,这里面还涉及到js的知识,抓包的知识,等等,我也是听别人说的,具体还真不了解。
回复 使用道具 举报
黄玉昆 发表于 2013-4-29 14:29
其实你这样查找,很难找到其中的链接的,因为好多都是用网页的一些代码写的,原理我不太清楚的,而且很多 ...

一般网页上的连接大体都是<a href="home.php?mod=medal">这样类型,用字符串的知识应该就能把home.php?mod=medal这些连接提取出来了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马