Java多线程抓取图片问题

Java_er 2016-11-12 01:53:42
1、利用Java自带的

// 构造URL
URL url = new URL(urlString);
// 打开连接
URLConnection con = url.openConnection();
//设置请求超时为10s
con.setConnectTimeout(10*1000);
// 输入流
InputStream is = con.getInputStream();


2、将下载的图片保存到本地指定路径

但是这样有一个问题,抓取网络图片的时候,图片规则可以获取,如果图片非常非常多,这样下载起来就非常耗时了。

我现在初步想着开启一个for循环,一次性搞200个线程去下载。


...全文
339 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
再不斩 2016-11-14
  • 打赏
  • 举报
回复
引用 1 楼 NewMoons 的回复:
你开几个应该都一样,这是由网速决定的,不是由本机cpu和io决定的。 比如你10M的带宽,一个线程虽然是一个个顺序下载,但速度是10M,你10个线程,每个线程的现在速度是1M。结果还是一样。 也就是说相对于网速,多线程带来的cpu及io节省的时间几乎可以忽略。瓶颈还是在网速。 当然我也是纸上谈兵,欢迎大家验证。
假如其中一个图片资源不稳定的话,单线程可能就卡住了。多线程的话可以充分利用带宽。可以这么理解吗?
Golden_Dog 2016-11-13
  • 打赏
  • 举报
回复
个人觉着实现上可以主线程负责抓取、去重。线程池负责下载、处理超时的图片请求。
Java_er 2016-11-13
  • 打赏
  • 举报
回复
引用 2 楼 YidingHe 的回复:
可以多线程,每个线程单独下载图片。这样当一个线程速度慢时,其他线程仍然可以把带宽用起来。 多线程实现这个的思路就是: 1、任务有一个队列(或者说数组); 2、每个线程从队列中拿取要下载的图片地址,然后进行下载,下载完后继续拿取任务; 3、每个任务只会被拿取一次,以免重复下载; 4、当线程发现队列中没有任务时,线程结束; 5、当所有线程结束时,意味着所有图片都下载完了。 上面是一个简单的流程,按照它实现出来就可以了。
已用newFixedThreadPool、newFixedThreadPool 3Q
捏造的信仰 2016-11-13
  • 打赏
  • 举报
回复
可以多线程,每个线程单独下载图片。这样当一个线程速度慢时,其他线程仍然可以把带宽用起来。 多线程实现这个的思路就是: 1、任务有一个队列(或者说数组); 2、每个线程从队列中拿取要下载的图片地址,然后进行下载,下载完后继续拿取任务; 3、每个任务只会被拿取一次,以免重复下载; 4、当线程发现队列中没有任务时,线程结束; 5、当所有线程结束时,意味着所有图片都下载完了。 上面是一个简单的流程,按照它实现出来就可以了。
NewMoons 2016-11-12
  • 打赏
  • 举报
回复
你开几个应该都一样,这是由网速决定的,不是由本机cpu和io决定的。 比如你10M的带宽,一个线程虽然是一个个顺序下载,但速度是10M,你10个线程,每个线程的现在速度是1M。结果还是一样。 也就是说相对于网速,多线程带来的cpu及io节省的时间几乎可以忽略。瓶颈还是在网速。 当然我也是纸上谈兵,欢迎大家验证。

62,614

社区成员

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

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