Groovy - GPars - 活动对象 - 返回值的活动方法

时间:2012-11-28 17:48:03

标签: groovy gpars

在Groovy中,我需要实现一个名为MyCounter的ActiveObject实例,以便以下代码通过:

final MyCounter counter = new MyCounter()
counter.incrementBy 10
counter.incrementBy 20
counter.update 'Hello'
assert 35 == counter.value

我已经提供了下面列出的两个实现 - 它们都不起作用。

1

@ActiveObject
class MyCounter
{
    private int counter = 0

    @ActiveMethod
    def incrementBy(int value)
    {
        println "incrementBy $value"
        counter += value;
    }

    @ActiveMethod
    def update(String value)
    {
        println "update $value"
        counter += value.size();
    }

    int getValue()
    {
        println "getValue"
        return counter;
    }
}

我认为这不起作用,因为对incrementBy的调用不会阻止,例如value属性,因此计数器变量实际上是在incrementBy操作完成之前访问的。

2

@ActiveObject
class MyCounter
{
    private int counter = 0

    @ActiveMethod
    def incrementBy(int value)
    {
        println "incrementBy $value"
        counter += value;
    }

    @ActiveMethod
    def update(String value)
    {
        println "update $value"
        counter += value.size();
    }

    @ActiveMethod
    int value()
    {
        println "getValue"
        return counter;
    }
}

编译器告诉我:

  

非阻塞方法不得返回特定类型,请改用def或void

2 个答案:

答案 0 :(得分:2)

好的,根据假设这是GPars,你应该可以使用以下代码来使用你的第一个实现:

final MyCounter counter = new MyCounter()
def x1 = counter.incrementBy 10
def x2 = counter.incrementBy 20
def x3 = counter.update 'Hello'
x1.get() //block
x2.get() //block
x3.get() //block
assert 35 == counter.value

您可能需要提供更多信息,以确定您在执行流程方面的具体目标,以获得更好的信息。

您还可以更改注释以指示阻止:

@ActiveMethod(blocking=true)

有关上述任何内容的信息,请参阅相关docs

答案 1 :(得分:1)

第一个例子有一个竞争条件,因为getValue()直接触及对象的不受保护的内部状态,而incrementBy()和update()都使用活动对象的内部actor来修改对象的状态。

在第二个示例中,由于非阻塞方法返回Promise的实例,因此不允许提供特定的返回类型,例如int。

与Brian建议的内容一致,只需使用@ActiveMethod(blocking=true)注释getValue()方法,这将允许您提供特定的返回类型。

@ActiveMethod(blocking=true)
int getValue() {...}