ComingtoExpert
阿韬
采纳率0%
2017-01-18 14:52 阅读 2.3k

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

10

写了一个网络爬虫程序,每隔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条回答 默认 最新

  • qq_28663043 漏断人初静v 2017-01-19 00:04

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

    点赞 1 评论 复制链接分享
  • LD0807 海之沐 2017-01-18 15:19

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

    点赞 评论 复制链接分享
  • JE_GE JE_GE 2017-01-18 15:40

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

    点赞 评论 复制链接分享
  • caozhy 从今以后生命中的每一秒都属于我爱的人 2017-01-18 15:53
    点赞 评论 复制链接分享
  • baidu_26611019 蚂蚁冲锋队 2017-01-19 00:44

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

    点赞 评论 复制链接分享
  • HeLiang7 HeLiang7 2017-01-19 02:18

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

    点赞 评论 复制链接分享
  • sycdzdd 68号小喇叭 2017-01-19 02:54

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

    点赞 评论 复制链接分享
  • p0pp0p0 陈者神龟 2017-01-19 10:39

    使用java提供的executor

    点赞 评论 复制链接分享
  • k1280000 咕泡学院-James老师 2017-02-21 09:56

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

    点赞 评论 复制链接分享
  • java_wht 迷失的夜行者 2017-05-13 15:27

    用线程池吧,定义标记,

    点赞 评论 复制链接分享

相关推荐