刚刚完成一个网站抓取数据的任务,在抓取的时候用到了多线程。

任务描述:
    有个信息发布网站,按照条件会查询出数据,按页显示,每页15条,每条信息为一个url链接。点击链接再打开一个页面,显示这条的详细信息。

我们需要做的是把每条的详细信息都抓取下来,保存到数据库中。

开始我做好了抓取的所有程序,保存到数据库中。
做完运行,发现速度很慢,因为数据量比较大,大约有30多万条详细信息需要抓取。

就想到这个用多线程来实现真是再好不过了,开15条线程,一次就把一页的详细信息都抓取下来,不是很快吗?

后来加上多线程后,一次开16线程,比原来快了很多,呵呵~!

因为这个工程是用java实现的,下面是java实现这个多线程的主要代码,用c#应该也是一样的!有兴趣的可以翻译成c#的,厚厚~
import java.util.ArrayList;

public class Catcher
{
    private static ArrayList threads= new ArrayList();//存储未处理URL
    public static boolean isFinished=false;//是否已经把所有的链接存到threads了
   
    public synchronized String  getUrl()
    {
        if(threads.size()>0)
        {
            String tmp = String.valueOf(threads.get(0));
            threads.remove(0);
            return tmp;
        }else
            return null;
    }
    public void process(){
        //处理预处理
       //下面开10个线程等待处理
     new Thread(new Processer(this)).start();
     new Thread(new Processer(this)).start();
     new Thread(new Processer(this)).start();
     new Thread(new Processer(this)).start();
     new Thread(new Processer(this)).start();
     new Thread(new Processer(this)).start();
     new Thread(new Processer(this)).start();
     new Thread(new Processer(this)).start();
     new Thread(new Processer(this)).start();
     new Thread(new Processer(this)).start();

//进入翻页的处理
        for(int j=0;j<10;j++)//从第一页翻到最后一页
        {
            for(int i = 0;i<15;i++)
            {
                threads.add(sUrl);//把URL存进去
            }
        }
        isFinished=true;       
    }
 
   
}

class Processer implements Runnable
{
    Catcher c;
    public Processer(Catcher c)
    {
        this.c = c;
    }
    public void run()
    {
        String tmp = null;
        while((tmp=c.getUrl())!=null || !c.isFinished)  //当还有记录时就处理       
        {
            if(tmp!=null)
            {
       //处理将一条信息保存到数据库
            }else//如果没标志处理则休眠一秒再重新开始处理
            {
                try
                {
                    Thread.sleep(1000);
                } catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
        }
       
    }
}

一个多线程应用的最佳示例相关推荐

  1. 一个多线程示例程序的BUG修复

    一个多线程示例程序的BUG修复 在<.NET 4.0面向对象编程漫谈 >的<应用篇>一书中,我介绍了一个使用"信号量(Semaphore) "同步对象模拟多 ...

  2. python 多线程 类_Python中如何自定义一个多线程类呢?

    摘要: 下文讲述Python中自定义一个多线程类的方法分享,如下所示: 实现思路: 1.定义一个类继承threading.Thread 2.在自定义类中构造函数重写run方法 例: Python3中自 ...

  3. python代码示例下载-Python实现多线程下载脚本的示例代码

    0x01 分析 一个简单的多线程下载资源的Python脚本,主要实现部分包含两个类: Download类:包含download()和get_complete_rate()两种方法.download() ...

  4. scratch做简单跑酷游戏_腾讯游戏学院专家:做一个多线程游戏框架可以多简单?...

    导语 如何做一个多线程游戏框架?腾讯游戏学院专家Tao将在本文通过一个demo来说说游戏逻辑的多线程化. 众所周知现在各种游戏终端的发展十分迅猛.其中一个共同的特征是"多核化",由 ...

  5. php数组选择随机元素,php 数组随机选择一个元素显示的简单示例

    这篇文章主要为大家详细介绍了php 数组随机选择一个元素显示的简单示例,具有一定的参考价值,可以用来参考一下. 本代码演示了如何从php数组中随机选择一个元素显示,感兴趣的小伙伴,下面一起跟随512笔 ...

  6. 用 python 实现一个多线程网页下载器

    今天上来分享一下昨天实现的一个多线程网页下载器. 这是一个有着真实需求的实现,我的用途是拿它来通过 HTTP 方式向服务器提交游戏数据.把它放上来也是想大家帮忙挑刺,找找 bug,让它工作得更好. k ...

  7. 一个多线程死锁案例,如何避免及解决死锁问题?

    多线程死锁在java程序员笔试的时候时有遇见,死锁概念在之前的文章有介绍,大家应该也都明白它的概念,不清楚的去翻看历史文章吧. 下面是一个多线程死锁的例子 public class lock{priv ...

  8. java实现一个单例设计模式_Java正确实现一个单例设计模式的示例

    Java正确实现一个单例设计模式的示例 发布于 2021-1-12| 复制链接 分享一篇关于关于Java正确实现一个单例设计模式的示例,小妖觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的 ...

  9. boost::log模块实现多线程异步日志记录示例

    boost::log模块实现多线程异步日志记录示例 实现功能 C++实现代码 实现功能 boost::log模块实现多线程异步日志记录示例 C++实现代码 #include <stdexcept ...

最新文章

  1. Linux期末复习题库(3)
  2. 一个封装了的选项卡效果js
  3. 疯传社群源码v7.8.0 测试可用 修复绿色版
  4. IIS搭建网站遇到的问题
  5. Win-MASM64汇编语言-$/取当前行代码的地址
  6. 团队博客-11月15日
  7. 为项目配置了Bean,结果Spring Boot并没有扫描到
  8. sqldeveloper不能启动,显示Unable to create an instance of the Java Virtual Machine...的解决办法...
  9. php个人微信聊天机器人,wxpy将个人微信号变成微信聊天机器人
  10. Git merge合并冲突 error: ‘merge‘ is not possible because you have unmerged files的解决方法
  11. NetBeans修改字体中文乱码问题
  12. Restful API设计规范及实战
  13. 法大大完成3.98亿元C轮融资,虎环球基金和腾讯联合领投...
  14. 2017年排名前50位的开发人员工具
  15. 《群山唱响》-- 爱的力量
  16. 用html做相册需要什么,如何快速有效的生成HTML相册?
  17. 前端基础知识概述 -- 移动端开发的屏幕、图像、字体与布局的兼容适配
  18. linux rm 提示权限不足
  19. MySQL-数据查询语言(DQL)
  20. STC89C52单片机定时器及中断系统的介绍以及代码示例

热门文章

  1. 通过组策略和注册表关闭win7 UAC。
  2. 在pymongo中使用distinct
  3. Spring2.5+MINA2搭建Socket Server
  4. java native
  5. 调用webservice接口,数据不回滚问题
  6. 基于Spring可扩展Schema提供自定义配置支持(spring配置文件中 配置标签支持)
  7. Mybatis中模糊查询的各种写法(转)
  8. Java 继承 执行顺序
  9. SQL 调优专题总结
  10. RTMPdump(libRTMP) 源代码分析 3: AMF编码