利用JAVA实现一个多线程爬虫
利用JAVA实现一个多线程爬虫?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
JAVA 多线程爬虫实例详解
前言
以前喜欢Python的爬虫是出于他的简洁,但到了后期需要更快,更大规模的爬虫的时候,我才渐渐意识到Java的强大。Java有一个很好的机制,就是多线程。而且Java的代码效率执行起来要比python快很多。这份博客主要用于记录我对多线程爬虫的实践理解。
线程
线程是指一个任务从头至尾的执行流。线程提供了运行一个任务的机制。对于Java而言,可以在一个程序中并发地启动多个线程。这些线程可以在多处理器系统上同时运行。
runnable接口
任务类必须实现runnable接口,它只包含一个run方法。需要实现这个方法来告诉系统线程将如何运行。
Thread类
包含为任务而创建的线程的构造方法,以及控制线程的方法。
synchronized关键字
为避免竞争状态,防止多个线程同时进入程序的某个特定部分,即临界区,以便一次只有一个线程可以访问临界区。
利用加锁同步
Java可以显式加锁,一个锁是一个Lock接口的实例,它定义了加锁和释放锁的方法。
线程池
线程池是管理开发执行任务个数的理想方法。Java提供Executor接口来执行线程池中的任务,提供ExecutorService接口管理和控制任务。
使用线程池的方法获取url列表
import java.util.ArrayList;import java.util.List;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class MyThreading { private static String p_id = null; private static Url urls = null; public MyThreading(String p_id){ this.p_id = p_id ; // 京东商品的id urls = new Url(p_id); } public List<String> getUriList(){ ExecutorService executor = Executors.newCachedThreadPool(); for (int i = 0 ; i < 600 ; i ++){ executor.execute(new AddUrl(i)); // 添加任务到线程池 } executor.shutdown(); while (!executor.isTerminated()){} return urls.getList(); } public static class AddUrl implements Runnable{ int page; public AddUrl(int page){ this.page = page; } public void run(){ urls.addList(page); // 启动多线程任务 } } public static class Url { private static Lock lock = new ReentrantLock(); // 开启显式家锁 private static List<String> urlList = new ArrayList(); private String p_id; public Url(String p_id ){ this.p_id = p_id ; } public List<String> getList(){ return urlList; } public void addList(int page){ lock.lock(); try{ String url = "http://club.jd.com/productpage/p-" + p_id + "-s-0-t-0-p-" + String.valueOf(page) + ".html";// Thread.sleep(5); urlList.add(url); //添加url到url列表 }catch(Exception ex ){ } finally { lock.unlock(); // 解锁 } } } public static void main(String[] args) { String p_id = "2441288"; MyThreading myThreading = new MyThreading(p_id); List <String> urlList = myThreading.getUriList(); for(String url : urlList){ System.out.println(url); } System.out.println(urlList.size()); }}
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
利用JAVA实现一个多线程爬虫
下载Word文档到电脑,方便收藏和打印~
相关文章
- Ruby加密技术:如何改变数据存储方式?
- 在 Java 中,arraycopy 方法的具体用法是什么?(java中arraycopy的用法是什么)
- 如何巧妙利用 Java Map 来实现缓存功能?(如何利用Java Map实现缓存功能)
- Java 中 zlib 库的使用技巧有哪些?(Java中zlib库的使用技巧)
- 在 Java 中如何将 Object 转换为自定义类型?(java怎么将Object转换为自定义类型)
- Java多线程编程中常见错误有哪些?如何解决?(Java多线程编程常见错误及解决方法)
- 在 eclipse 中如何进行 java 代码规范设置?(eclipse下java代码规范设置)
- 如何在 Java 分布式架构中避免错误?(Java分布式架构如何避免错误)
- 如何利用 Java 多线程来进行数据统计?(怎么用java多线程统计数据)
- 掌握Ruby加密与解密:确保数据安全的关键步骤