并行调用远程对象的问题

时间:2009-11-29 00:44:16

标签: flex

我在flex中有以下应用程序。我想并行调用两个不同的远程对象。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
 <mx:RemoteObject id="service1" destination="test1" />
    <mx:RemoteObject id="service2" destination="test2" />
    <mx:Button label="service1" click="{service1.method(1)}" />
    <mx:Button label="service2" click="{service2.method(2)}" />
    <mx:Button label="service1 AND service2" click="{service1.method(1);service2.method(2)}" />
</mx:Application>

每个远程对象都连接到一个名为TestCase1和TestCase2的不同Java实现。所以我认为我可以并行调用这两个对象并相互并行执行它们。

public class TestCase1 {

 public void method(int n) {
        System.out.println("method(" + n + ") starts");
        try {
            Thread.sleep(8000);
        } catch(InterruptedException e) {}
        System.out.println("method(" + n + ") ends");
    }

}

public class TestCase2 {

 public void method(int n) {
        System.out.println("method(" + n + ") starts");
        try {
            Thread.sleep(8000);
        } catch(InterruptedException e) {}
        System.out.println("method(" + n + ") ends");
    }

}

现在方法的作用是打印......当他们被召唤时,等待8秒并打印出来。之后。

单独点击每个按钮时,它会起作用,两种方法都是并行启动的。 但是,同时调用这两个方法,使一个服务等待其调用,直到另一个正在执行。

我该如何避免?

THX 菲利普

enter code here

2 个答案:

答案 0 :(得分:0)

RemoteObject请求排队到下一个执行帧,然后通过相同的HTTP请求发送,即。同一请求上的多个操作。所以当你致电时:service1.method(1);service2.method(2)
这两个操作都在同一个HTTP请求上进行。第一个导致处理该请求的线程处于休眠状态,从而导致在线程恢复之前不会调用第二个操作。

我知道避免这种情况的唯一方法是确保每个操作都依赖于它自己的HTTP请求,从而获得它自己的线程。但请记住,在大多数浏览器中,您只能获得2个并发HTTP请求。因此,如果您一次发出两个以上的请求,那么您仍然会被阻止,并且不会超过2个并发操作。

在下一帧获取请求的简单方法是使用callLater,如:

service1.method(1);  
callLater(function():void { service2.method(2) });

我相信这会导致第一次操作发生在下一帧,第二次操作将发生在下一帧。您可能需要在callLater周围包装另一个callLater,以确保它在第一次操作后进入框架。

答案 1 :(得分:0)

如果你有很多请求 - callLater将无法帮助,因为所有请求将在下一帧并行执行。 让我知道你对这个灵魂的看法: 添加函数数组,我们将推送我们需要在每个帧上运行的回调,并添加事件列表:ENTER_FRAME,在每个输入框架上,我们将从数组中弹出一个函数并执行它。 数组和事件将在主应用程序上。

谢谢,