首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GPars:等待演员结束

GPars:等待演员结束
EN

Stack Overflow用户
提问于 2013-02-22 06:51:11
回答 1查看 689关注 0票数 2

我想我从医生那里弄错了。

我有两个演员,XMLActor和HttpActor。XMLActor读取xmlFiles,然后向HTTPActor发送一条消息进行处理。XMLActor将比HttpActor更快完成。

我的主类对两个参与者都调用join。我原以为主线程只有在两个角色都完成后才会终止。但是,实际发生的情况是,一旦XMLActor处理完所有消息,系统就会终止,并且许多消息不会被HttpActor处理。

我可以使用一些闩锁甚至AtomicInteger来等待所有消息被使用,但我想知道是否有更优雅的方法。

代码语言:javascript
复制
final HttpActor httpActor = new HttpActor().start()
final XMLActor xmlActor = new XMLActor(httpActor:httpActor).start()
Actors.actor {
        file.eachLine { line ->
            def chunks = line.split(",")
            def id = chunks[0].replaceAll("\\\"","").trim()
            def name = chunks[1].replaceAll("\\\"","").trim()
            xmlActor << new FileToRead(basePath:args[1],id:id,name:name, fileCounter:counter)
        }
    }
[httpActor, xmlActor]*.join()

//inside xmlActor
countries.each {  country ->
            httpActor << new AlbumPriceMessage(id:message.id, country:country)
        }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-22 12:55:43

join()方法肯定会等待两个参与者都完成。我不明白你是怎么阻止这两个演员的,所以我真的不能对此发表评论。你会发送这种有害的信息吗?或者在actors上调用stop()?

例如,您的案例的以下模拟将正确停止:

代码语言:javascript
复制
import groovyx.gpars.actor.*;

def httpActor = Actors.staticMessageHandler {
    println "Http actor processing " + it
}

def xmlActor = Actors.staticMessageHandler {
    println "XML Actor processing " + it
    httpActor << it
}

xmlActor.metaClass.afterStop = {
    httpActor.stop()
}

100.times {
    xmlActor << "File$it"
}
xmlActor.stop()

[xmlActor, httpActor]*.join()
println "done"
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15013751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档