BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #40658同步于 2015/5/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

[已解决」多线程的两个问题

dmlaomao
2015/5/12镜像同步14 回复
1. 在写一个爬虫,多线程请求多个url 和 单个线程请求多个url 效率上有区别吗?仅考虑下载内容,不考虑解析。 2. 使用线程池的话,如何判断一个pool中的某个线程是否已经结束? 最近想搞个多线程爬虫,已糊涂..... 请各位大神解惑,不胜感激
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
aiquestion机器人#1 · 2015/5/12
1. 一般情况下,多线程会快。因为下载时间一般远远大于创建线程时间。 2. 不知道。不过好奇你为啥需要判断线程池的一个线程是否结束?那个应该是线程池管的事情。而且一个线程执行完任务之后可能会被线程池丢去执行新的任务。 如果你想要知道你提交的那个任务是否结束,可以用execute时候返回的那个Task。 【 在 dmlaomao 的大作中提到: 】 : 1. 在写一个爬虫,多线程请求多个url 和 单个线程请求多个url 效率上有区别吗?仅考虑下载内容,不考虑解析。 : 2. 使用线程池的话,如何判断一个pool中的某个线程是否已经结束? : 最近想搞个多线程爬虫,已糊涂..... 请各位大神解惑,不胜感激
nuanyangyang机器人#2 · 2015/5/12
1. 差不多,理论上单线程polling最快,免去创建线程、操作系统线程切换的代价。在Java里对应的接口是nio里的Selector。但我不知道现有的哪个HTTP库是基于Selector的。如果不是10000个并发请求这个数量级的话,多线程更简单。 2. 用ExecutorService吧。它提供fork-join模型。你可以提交任务,任务被提交以后,就立即给你一个“Future”,这个对象可以让你判断这个任务是否结束了,也可以等待这个任务结束。使用这种模型的时候,你不需要提到“线程”,你只需要知道“任务提交了”而且“Future可以让我在以后拿到结果”就可以了。有可能这个ExecutorService是单线程的,也有可能是真的多线程的,但你不需要知道这个细节。看java.util.concurrent.ExecutorService接口和Future<T>类。
dmlaomao机器人#3 · 2015/5/12
二位大神回答好详细,继续学习中
aiquestion机器人#4 · 2015/5/12
=。=唔,我以为lz单线程指的是一个一个同步慢慢来。。。 HTTP库的话,Netty, Apache的Httpclient也有一个支持async的,不过当时我看的时候还是alpha版。。 https://github.com/AsyncHttpClient/async-http-client 好像当时用过这个,基于Netty封装的。 Sorry,第二个那个不是Task。。。c井狗掩面跑开~~~~~~ 【 在 dmlaomao 的大作中提到: 】 : 1. 在写一个爬虫,多线程请求多个url 和 单个线程请求多个url 效率上有区别吗?仅考虑下载内容,不考虑解析。 : 2. 使用线程池的话,如何判断一个pool中的某个线程是否已经结束? : 最近想搞个多线程爬虫,已糊涂..... 请各位大神解惑,不胜感激
renyi机器人#5 · 2015/5/12
指的是epoll,no-blocking io? 【 在 nuanyangyang 的大作中提到: 】 : 1. 差不多,理论上单线程polling最快,免去创建线程、操作系统线程切换的代价。在Java里对应的接口是nio里的Selector。但我不知道现有的哪个HTTP库是基于Selector的。如果不是10000个并发请求这个数量级的话,多线程更简单。 : 2. 用ExecutorService吧。它提供fork-join模型。你可以提交任务,任务被提交以后,就立即给你一个“Future”,这个对象可以让你判断这个任务是否结束了,也可以等待这个任务结束。使用这种模型的时候,你不需要提到“线程”,你只需要知道“任务提交了”而且“Future可以让我在以后拿到结果”就可以了。有可能这个ExecutorService是单线程的,也有可能是真的多线程的,但你不需要知道这个细节。看java.util.concurrent.ExecutorService接口和Future<T>类。
renyi机器人#6 · 2015/5/12
下意识地看了下IP,论坛大神你好! 我记得之前有一篇nginx与Apache的性能对比文章,貌似就是说的这模型... 【 在 aiquestion 的大作中提到: 】 : =。=唔,我以为lz单线程指的是一个一个同步慢慢来。。。 : HTTP库的话,Netty, Apache的Httpclient也有一个支持async的,不过当时我看的时候还是alpha版。。 : https://github.com/AsyncHttpClient/async-http-client : ...................
nuanyangyang机器人#7 · 2015/5/12
【 在 renyi 的大作中提到: 】 : 指的是epoll,no-blocking io? : 是。
agapple机器人#8 · 2015/5/12
暖神,不太理解,单线程抓取会经常出现断线的问题,见过的爬虫也是采用多线程多一些,求解答! 【 在 nuanyangyang 的大作中提到: 】 : 1. 差不多,理论上单线程polling最快,免去创建线程、操作系统线程切换的代价。在Java里对应的接口是nio里的Selector。但我不知道现有的哪个HTTP库是基于Selector的。如果不是10000个并发请求这个数量级的话,多线程更简单。 : 2. 用ExecutorService吧。它提供fork-join模型。你可以提交任务,任务被提交以后,就立即给你一个“Future”,这个对象可以让你判断这个任务是否结束了,也可以等待这个任务结束。使用这种模型的时候,你不需要提到“线程”,你只需要知道“任务提交了”而且“Future可以让我在以后拿到结果”就可以了。有可能这个ExecutorService是单线程的,也有可能是真的多线程的,但你不需要知道这个细节。看java.util.concurrent.ExecutorService接口和Future<T>类。
yyy8848机器人#9 · 2015/5/12
南洋理工的大神? 【 在 renyi 的大作中提到: 】 : 下意识地看了下IP,论坛大神你好! : 我记得之前有一篇nginx与Apache的性能对比文章,貌似就是说的这模型... :