Java编程的多线程,如何实现更好一些? 10C

写了一个网络爬虫程序,每隔10分钟,启动一次爬虫执行。

爬虫程序中,使用了多线程:爬虫程序使用10个线程的多线程,爬取一个指定页面的一些页面数据。 由于每隔10分钟,启动一次爬虫程序,因此,这10个线程就会每10分钟重新生成一次,每天从早晨8:00左右开始,运行了19:30左右时,便就会出现Memroy Overflow的再现。咨询一下大侠,出现如下的错误,有什么好的解决办法?

Exception in thread "Thread-690" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Unknown Source)
at java.lang.String.(Unknown Source)
at org.apache.http.util.CharArrayBuffer.toString(CharArrayBuffer.java:461)
at org.apache.http.util.EntityUtils.toString(EntityUtils.java:236)
at org.apache.http.util.EntityUtils.toString(EntityUtils.java:257)
at com.cn.Spilder0721.DownloadBidEntity.getBidEntityFormUrl(DownloadBidEntity.java:102)
at com.cn.Spilder0721.BidDataHanding.dataHanding(BidDataHanding.java:23)
at com.cn.Spilder0721.BidDataHanding.run(BidDataHanding.java:33)

10个回答

一直在生成线程,但是没有回收线程!线程数超过一定数量内存就满了!才会出现memoryoverflow异常!解决的方法我认为有以下几种:1.定期回收线程(根本方法)2.扩大虚拟机的栈内存3.通过减小线程占用内存大小来换取更多的内存!希望有帮助!

qq_28663043
漏断人初静v 更多的线程数!
3 年多之前 回复

考虑用线程池,或者你要杀掉那些线程,而不是一直在生成线程。

线程使用和关闭的太快了,肯定需要重用
http://www.cnblogs.com/dolphin0520/p/3932921.html

为何要不断地生成线程,十个线程设置十个标志位,通过标志位来关闭线程和重用线程岂不是更好

不要自己实现线程,用quartz来实现。
百度下这个,很多教程,实现非常简单可靠。
记得Job加上@DisallowConcurrentExecution就可以避免多个任务重复运行。

1、所有线程共享已爬取和未爬取url数据对象,当全部爬取完毕时,线程退出;
2、考虑用线程池,如果当前在用线程过多,则等待。

使用java提供的executor

用线程池就可以了,有任务会启动线程,没有任务线程会被回收剩下coreSize个线程

用线程池吧,定义标记,

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐