java多线程下载美女图片

Main.java

主线程,控制两个线程池,待任务处理完成后关闭线程池

package photo;import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;public class Main {static final String IMG_ROOT = "D:/meinv/";public static void main(String[] args) {main2(args);}public static void main1(String[] args) {long begin = System.currentTimeMillis();Spider s = new Spider();String url = "http://me2-sex.lofter.com/tag/%E7%BE%8E%E5%A5%B3%E6%91%84%E5%BD%B1";for (int page = 1; page <= 10; page++) {String content = s.getContent(url, page);List<String> urlList = s.parseContent(content);for (String picUrl : urlList) {int index = picUrl.lastIndexOf("=");String file = IMG_ROOT + picUrl.substring(index + 2);s.downPhoto(picUrl, file);}}long end = System.currentTimeMillis();System.out.println("total cost time:" + (end - begin) / 1000 + "s");}public static void main2(String[] args) {LinkedBlockingDeque<String> photoUrlQue = new LinkedBlockingDeque<String>(300);ExecutorService executor = Executors.newFixedThreadPool(3);for (int page = 1; page <= 10; page++) {executor.execute(new DownPage(photoUrlQue, page));}ExecutorService photoexecutor = Executors.newFixedThreadPool(5);Status status = new Status();for (int i = 0; i < 5; i++) {photoexecutor.execute(new DownPhoto(photoUrlQue,status));}executor.shutdown();while (!executor.isTerminated()) {try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}status.doStop();photoexecutor.shutdown();}
}

DownPhoto.java

下载图片的线程,从队列中获得url,下载并保存到本地磁盘

package photo;import java.util.concurrent.LinkedBlockingDeque;public class DownPhoto implements Runnable {static final String         IMG_ROOT = "D:/meinv/";LinkedBlockingDeque<String> photoUrlQue;private Status status;public DownPhoto(LinkedBlockingDeque<String> photoUrlQue,Status status){this.photoUrlQue = photoUrlQue;this.status = status;}@Overridepublic void run() {while (true) {try {if(photoUrlQue.isEmpty() && status.isStoped()){break;}String picUrl = photoUrlQue.take();Spider s = new Spider();int index = picUrl.lastIndexOf("=");String file = IMG_ROOT + picUrl.substring(index + 2);s.downPhoto(picUrl, file);} catch (InterruptedException e) {break;}}}}

DownPage.java

下载网页内容,并分析图片url,存放到队列中,以供另外一个线程使用

package photo;import java.util.List;
import java.util.concurrent.LinkedBlockingDeque;public class DownPage implements Runnable {LinkedBlockingDeque<String> photoUrlQue;int                         page;String                      url = "http://me2-sex.lofter.com/tag/%E7%BE%8E%E5%A5%B3%E6%91%84%E5%BD%B1";public DownPage(LinkedBlockingDeque<String> photoUrlQue, int page){this.photoUrlQue = photoUrlQue;this.page = page;}@Overridepublic void run() {Spider s = new Spider();String content = s.getContent(url, page);List<String> urlList = s.parseContent(content);for (String picUrl : urlList) {photoUrlQue.push(picUrl);}}
}

Spider.java

http通讯工具类
需要引入apache的commons-httpclient、commons-codec、commons-logging包

package photo;import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;public class Spider {public String getContent(String url, int page) {HttpClient client = new HttpClient();url += "?page=" + page;HttpMethod method = new PostMethod(url);method.setFollowRedirects(false);method.addRequestHeader("User-Agent","Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31");try {int status = client.executeMethod(method);if (status != 200) {return null;}return method.getResponseBodyAsString();} catch (Exception e) {e.printStackTrace();} finally {method.releaseConnection();}return null;}public void downPhoto(String url, String fileName) {HttpClient client = new HttpClient();HttpMethod method = new GetMethod(url);method.setFollowRedirects(false);method.addRequestHeader("User-Agent","Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31");try {int status = client.executeMethod(method);if (status != 200) {return;}InputStream is = method.getResponseBodyAsStream();BufferedInputStream bis = new BufferedInputStream(is);File f = new File(fileName);OutputStream os = new FileOutputStream(f);BufferedOutputStream bos = new BufferedOutputStream(os);byte[] buffer = new byte[128];int readLen = -1;while ((readLen = bis.read(buffer)) != -1) {bos.write(buffer, 0, readLen);bos.flush();}bos.close();bis.close();} catch (Exception e) {e.printStackTrace();} finally {method.releaseConnection();}}public static void main(String[] args) {}public List<String> parseContent(String content) {List<String> urlList = new ArrayList<String>();// <img src="http://imglf0.ph.126.net/BKehcpizRueVO8BuzwT8Lg==/6630835768745140932.jpg" />Pattern p = Pattern.compile("<img\\s*src=\"(\\S+)\"\\s*/>");// String inputMatcher m = p.matcher(content);while (m.find()) {String url = m.group(1);//System.out.println(url);urlList.add(url);}return urlList;}}

Status

状态控制类

package photo;public class Status {private volatile boolean stop;public void doStop() {stop = true;}public boolean isStoped() {return stop;}
}

java多线程下载美女图片相关推荐

  1. Java多线程下载文件

    Java多线程下载文件 优化:合理利用服务器资源,将资源利用最大化,加快下载速度 一般有两种方式: 线程池里面有N个线程,多线程下载单个文件,将网络路径的文件流切割成多快,每个线程下载一小部分,然后写 ...

  2. Java多线程下载器(简洁版)

    Java多线程下载器 https://github.com/rawchen/JDownloader/archive/refs/heads/master.zip 五一无聊搞出来的,虽然已存在IDM.XD ...

  3. java 多线程下载图片_java多线程实现下载图片并压缩

    最近在做一个需求:从其他系统的ftp目录下载存储图片url的文件,然后读取文件中的url地址,根据地址下载图片后按天压缩成一个包,平均一个地址文件中包含4000个地址左右,也就是说一个文件扫描后需要下 ...

  4. Java多线程下载分析方法

    为什么要多线程下载 俗话说要以终为始,那么我们首先要明确多线程下载的目标是什么,不外乎是为了更快的下载文件.那么问题来了,多线程下载文件相比于单线程是不是更快? 对于这个问题可以看下图. 横坐标是线程 ...

  5. java 多线程下载器_Java多线程的下载器(1)

    实现了一个基于Java多线程的下载器,可提供的功能有: 1. 对文件使用多线程下载,并显示每时刻的下载速度. 2. 对多个下载进行管理,包括线程调度,内存管理等. 一:单个文件下载的管理 1. 单文件 ...

  6. java多线程下载_Java实现多线程下载,支持断点续传

    多线程下载及断点续传的实现是使用 HTTP/1.1 引入的 Range 请求参数,可以访问Web资源的指定区间的内容.虽然实现了多线程及断点续传,但还有很多不完善的地方. 包含四个类: Downloa ...

  7. java 多线程下载文件

    2019独角兽企业重金招聘Python工程师标准>>> 1.基本思路 2.源码 package cn.itcast.download;import java.io.File; imp ...

  8. Java多线程下载并具断点续传功能JAR

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 这两天把 ...

  9. java 多线程下载_使用java实现http多线程下载

    Feedback # re: 使用java实现http多线程下载 2008-07-27 22:46 xzqttt 看了您的文章,收到了很大的启发,谢谢分享,好文! 回复  更多评论 # re: 使用j ...

  10. Python爬虫(二)——多线程下载壁纸图片(星月设计网)

    文章目录 Python爬虫--多线程下载图片(星月设计网) 目的: redis存储结构: 使用到的python库: 1. 导入相关库 2. 连接redis 3.爬虫主要类及函数 4.爬取结果: Pyt ...

最新文章

  1. 32位java 最大内存_【答疑系列】为什么32位系统只支持最大4G内存?
  2. 掌握好这23个Linux命令常用命令,让工作效率翻倍
  3. 笔记-中项案例题-2021年上-范围管理
  4. 七十一、去重交换排序链表、 求链表的中间结点
  5. 设置Web页面试用手机浏览器(iphone)
  6. DTO(领域数据传输对象)是做什么的
  7. Spark入门(四)Idea远程提交项目到spark集群
  8. js练习--贪吃蛇(转)
  9. 微型计算机主机箱内的所有部件均由大规模,2012年自考《计算机应用基础》模拟试题...
  10. 2021抖音私域经营白皮书
  11. 2021计算机职业适应性测试考什么,单招考试面试内容(职业适应性测试)大纲详解(信息技术类)...
  12. 8051系列单片机软件精确延时研究(二)
  13. php arsort函数,php-常用函数
  14. Javascript特效:照片墙
  15. List集合排序的两种方法
  16. 通识2——“视频编码”的相关概念
  17. autojs和按键精灵哪个好?按键精灵打包开始收费了,是弃坑还是继续杠?
  18. python语言中的转义字符_怎么使用Python转义字符
  19. 电脑或网页打开很慢是什么原因?
  20. 微信dat转码-微信数据库解密-dat批量查看

热门文章

  1. unity安装2020或2019出现空白错误
  2. 模糊C均值聚类 C++代码
  3. 不支持S/W HEVC(H265)解码的有效解决方案
  4. 十三届蓝桥杯EDA省赛赛后感
  5. 逻辑回归算法实战之信用卡欺诈检测
  6. MDK(Keil) 自动生成bin文件、汇编文件或者HEX文件、ASM文件
  7. 2.1 对称密钥的生成及以对象序列化方式保存
  8. 如何使用MATLAB绘制平滑曲线
  9. 关于PC电脑微信进粉计数器的选择?
  10. 计算机处理器基础原理笔记