一个多线程应用的最佳示例
刚刚完成一个网站抓取数据的任务,在抓取的时候用到了多线程。
任务描述:
有个信息发布网站,按照条件会查询出数据,按页显示,每页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();
}
}
}
}
}
一个多线程应用的最佳示例相关推荐
- 一个多线程示例程序的BUG修复
一个多线程示例程序的BUG修复 在<.NET 4.0面向对象编程漫谈 >的<应用篇>一书中,我介绍了一个使用"信号量(Semaphore) "同步对象模拟多 ...
- python 多线程 类_Python中如何自定义一个多线程类呢?
摘要: 下文讲述Python中自定义一个多线程类的方法分享,如下所示: 实现思路: 1.定义一个类继承threading.Thread 2.在自定义类中构造函数重写run方法 例: Python3中自 ...
- python代码示例下载-Python实现多线程下载脚本的示例代码
0x01 分析 一个简单的多线程下载资源的Python脚本,主要实现部分包含两个类: Download类:包含download()和get_complete_rate()两种方法.download() ...
- scratch做简单跑酷游戏_腾讯游戏学院专家:做一个多线程游戏框架可以多简单?...
导语 如何做一个多线程游戏框架?腾讯游戏学院专家Tao将在本文通过一个demo来说说游戏逻辑的多线程化. 众所周知现在各种游戏终端的发展十分迅猛.其中一个共同的特征是"多核化",由 ...
- php数组选择随机元素,php 数组随机选择一个元素显示的简单示例
这篇文章主要为大家详细介绍了php 数组随机选择一个元素显示的简单示例,具有一定的参考价值,可以用来参考一下. 本代码演示了如何从php数组中随机选择一个元素显示,感兴趣的小伙伴,下面一起跟随512笔 ...
- 用 python 实现一个多线程网页下载器
今天上来分享一下昨天实现的一个多线程网页下载器. 这是一个有着真实需求的实现,我的用途是拿它来通过 HTTP 方式向服务器提交游戏数据.把它放上来也是想大家帮忙挑刺,找找 bug,让它工作得更好. k ...
- 一个多线程死锁案例,如何避免及解决死锁问题?
多线程死锁在java程序员笔试的时候时有遇见,死锁概念在之前的文章有介绍,大家应该也都明白它的概念,不清楚的去翻看历史文章吧. 下面是一个多线程死锁的例子 public class lock{priv ...
- java实现一个单例设计模式_Java正确实现一个单例设计模式的示例
Java正确实现一个单例设计模式的示例 发布于 2021-1-12| 复制链接 分享一篇关于关于Java正确实现一个单例设计模式的示例,小妖觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的 ...
- boost::log模块实现多线程异步日志记录示例
boost::log模块实现多线程异步日志记录示例 实现功能 C++实现代码 实现功能 boost::log模块实现多线程异步日志记录示例 C++实现代码 #include <stdexcept ...
最新文章
- Linux期末复习题库(3)
- 一个封装了的选项卡效果js
- 疯传社群源码v7.8.0 测试可用 修复绿色版
- IIS搭建网站遇到的问题
- Win-MASM64汇编语言-$/取当前行代码的地址
- 团队博客-11月15日
- 为项目配置了Bean,结果Spring Boot并没有扫描到
- sqldeveloper不能启动,显示Unable to create an instance of the Java Virtual Machine...的解决办法...
- php个人微信聊天机器人,wxpy将个人微信号变成微信聊天机器人
- Git merge合并冲突 error: ‘merge‘ is not possible because you have unmerged files的解决方法
- NetBeans修改字体中文乱码问题
- Restful API设计规范及实战
- 法大大完成3.98亿元C轮融资,虎环球基金和腾讯联合领投...
- 2017年排名前50位的开发人员工具
- 《群山唱响》-- 爱的力量
- 用html做相册需要什么,如何快速有效的生成HTML相册?
- 前端基础知识概述 -- 移动端开发的屏幕、图像、字体与布局的兼容适配
- linux rm 提示权限不足
- MySQL-数据查询语言(DQL)
- STC89C52单片机定时器及中断系统的介绍以及代码示例