0

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

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 操作完成之前访问了 counter 变量。

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 代替

4

2 回答 2

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)

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

于 2012-11-28T19:07:32.730 回答
1

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

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

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

@ActiveMethod(blocking=true)
int getValue() {...}
于 2012-11-29T07:07:28.367 回答