【问题标题】:Better waiting syntax in JavaJava 中更好的等待语法
【发布时间】:2012-03-30 21:32:35
【问题描述】:

我有一个在后台运行的动画,我想在它完成时注册一个回调。该动画不是标准的 java 动画——它是通过 jni 访问的 c 动画(因此假设它只是 Object 类型)。

动画没有要注册的 onFinish 方法,但它确实有一个 isDone() 方法,如果动画不再运行则返回一个布尔值。为了创建回调,我添加了一个可运行对象:

class Foo implements Runnable {
    @Override
    public void run() {
        if (animation == null || target == null) return;
        while (!animation.isDone())
        {
            //loop until animation is done...
        }
        //execute callback
    }
}

这似乎是一种不好的方法 - 只是循环运行直到动画完成。也就是说,我的问题是:有哪些替代或首选方法可以等到 isDone() 返回 true 以执行我的回调?

【问题讨论】:

  • 有没有办法在线程中发出 JNI 调用,然后在完成时通知对象? JNI 调用是否在后台执行?

标签: java multithreading syntax callback semantics


【解决方案1】:

基本上,如果您无法控制 Animation 类,并且它仅提供 isDone() 方法,唯一的方法就是您所做的(但使用 Thread.sleep 一定时间,例如 10 或 50 毫秒)。

否则,您可以使用以下技术之一来组织它:

  1. wait/notify
  2. CyclicBarrier
  3. Future

【讨论】:

    【解决方案2】:

    如果你不能改变动画类使用

    while(!animation.isDone()){
        Thread.sleep(SOME_TIME);
    }
    

    但是,如果您可以更改动画行为,那么在动画结束时(当 isDone 开始返回 true 时)添加如下内容:

    synchronized(this){
        this.notifyAll();
    }
    

    你可以使用 while 循环

    synchronized(animation){
        if(!animation.isDone){
            animation.wait();
        }
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用订阅模式。您可以在动画中注册一个回调,以便在动画结束时执行您的回调。

      如果您的动画位于可运行对象或可调用对象中,则另一种选择可能是使用 Futures

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-30
        • 2011-10-23
        • 2012-03-23
        • 2013-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多