java多线程处理数据问题

fj359941160 2012-10-24 02:46:22
现在的问题是这样。

通过架构代理服务器在客户端上。
客户端访问一些页面代理服务器会自动存储这些页面的数据并进行解析。(这个过程比较耗时)


应该用多线程来处理。


该怎么处理呢?


我的想法是弄一个类实现Runnable接口,属性有个队列。 代理服务器如果遇到了需要解析的页面会先将这个页面的数据放入到队列里。 这个线程一直循环。 相隔10秒钟执行一个页面。


这样有问题吗? 如果在解析页面的时候出现了异常怎么办。 还有页面数据进出队列是不是也需要进行同步控制。
...全文
277 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dracularking 2012-10-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

如果出异常了 但是数据要保存下来。 是不是出异常的时候队列中这条数据就没了。

然后出异常后怎么继续执行操作这个队列里的数据。
[/Quote]

是这样的,这个异常是什么性质?是不是破坏了页面数据的完整性或合法性导致无法继续采用或无法修补或某些其它原因导致无法继续采集当前页面数据?这样的话就可以结论为当前这条数据没了(不过本来也没采集完,不能说没,只能说无法产生或完整了)

怎么继续操作:

while(the queue still has data and still needs to be operated) {
try {
insertDataIntoQueue();
} catch(UserDefinedDataException udde) {
exceptionOccurred();
}

workingOnTheQueue();
}
fj359941160 2012-10-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

>> 我的想法是弄一个类实现Runnable接口,属性有个队列。 代理服务器如果遇到了需要解析的页面会先将这个
>>页面的数据放入到队列里。 这个线程一直循环。 相隔10秒钟执行一个页面。


>>这样有问题吗? 如果在解析页面的时候出现了异常怎么办。 还有页面数据进出队列是不是也需要进行同步控
>>制。

异常的话关键是你要用什么策略来应对,可以终止程序,也可以跳过当前页面,继续……
[/Quote]

如果出异常了 但是数据要保存下来。 是不是出异常的时候队列中这条数据就没了。

然后出异常后怎么继续执行操作这个队列里的数据。
Kanepan 2012-10-24
  • 打赏
  • 举报
回复
起一个线程,来作为消费者。 putQueue则可以当做异步方法,写在你的action里。

代码片段:


private final static LinkedBlockingQueue<Message> queue = new LinkedBlockingQueue<Message>(); //假设用Message作为你需要处理的对象

public void run(){
//这个一直跑着
while (true) {
try {
Message msg = queue.take();
// do something! 耗时10秒的事情,这里可以另起线程,或者就不起线程,随你。
} catch (InterruptedException e) {
log.info("短信发送线程出错!", e);
}
}
}

public boolean putQueue(Message msg){
if(!queue.offer(msg)){
//入队列失败,可能是队列满了。这里可以做重新入列,和记录日志等操作
return false;
}
return true;

}

Kanepan 2012-10-24
  • 打赏
  • 举报
回复
LZ 你要搞清楚,你想异步处理,还是多线程处理?
如果想异步处理,则用BlockingQueue类,推荐ConcurrentLinkedQueue
如果想多线程处理,则直接将Runable丢入线程池.
xiangyun_1224 2012-10-24
  • 打赏
  • 举报
回复
建议楼主使用 yield让步方法。处理完一个就一直让步给下一个要处理的线程。
dracularking 2012-10-24
  • 打赏
  • 举报
回复
>> 我的想法是弄一个类实现Runnable接口,属性有个队列。 代理服务器如果遇到了需要解析的页面会先将这个
>>页面的数据放入到队列里。 这个线程一直循环。 相隔10秒钟执行一个页面。


>>这样有问题吗? 如果在解析页面的时候出现了异常怎么办。 还有页面数据进出队列是不是也需要进行同步控
>>制。

异常的话关键是你要用什么策略来应对,可以终止程序,也可以跳过当前页面,继续解析下个页面

线程持续处理队列中的页面数据。关于是否需要同步,你现在只有一个线程处理队列不需要同步了,否则的话可以用线程安全的Queue,比如BlockingQueue之类的
zxhcloth 2012-10-24
  • 打赏
  • 举报
回复
这个可以用生产者-消费者模式来处理
  • 打赏
  • 举报
回复
把要处理的放入队列,处理完一个就删除一个,没有就继续等待保持循环。
异常的话就在catch里重启当前new thread一个新线程,当然得保证你重启前那些数据怎么递交。

67,516

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧