Java中的Ada集合点

时间:2017-12-15 15:13:26

标签: java concurrency synchronization ada

因此,在Ada编程语言中,集合是一种进程间同步/消息传递的方法。如何在java中实现这种机制(以及任务暂停和选择性等待)?我正在查看java的远程方法调用和Exchanger类,但我还没有找到合适的解决方案。

3 个答案:

答案 0 :(得分:4)

在Java中实现的最难的部分是选择性等待和进入队列。阻塞队列是Ada中受保护条目的近似模拟,没有选择性等待。

我不相信Java中的Ada select语句有任何等价物。也没有办法提供具有程序员可选排队策略的入口队列的等效项。 Java等待/通知组合将激活等待线程,但您永远不知道哪一个。由notify命令实际激活的线程基于竞争条件,并且具有明显随机的效果。分析表明,在程序执行的某个时刻,每个等待线程都可以期望通过通知激活,但是在Java中无法保证线程激活的顺序,或者即使给定的线程将永远从等待状态激活。

答案 1 :(得分:2)

不熟悉ada但是快速谷歌 ada rendezvous 表示您可能正在寻找其中一个BlockingQueue实施,可能是SynchronousQueue

也许如果你描述了传递消息时你想要发生什么,我们可以提供更多帮助。

答案 2 :(得分:1)

你需要一个带有peekWait()函数的事件队列类型:(免责声明:这只是一个草图。它不是真正的代码。)

public class EventSemaphore<Event_T>
{
   public void signal(Event_T t);
   public Event_T    wait();
   public Event_T    peekWait();   // returns the signalled value if there is one, otherwise returns null and skips.

   // atomic signal requestQ and wait on responseQ
   public static Return_T signalAndWait<Signal_T,Return_T> (EventSemaphore<Signal_T> requestQ, Signal_T sigVal, EventSemaphore<Return_T> responseQ);   
}

一个条目有两个这样的事件:

public class Entry<Param_T,Return_T>
{
   EventSemaphore<Param_T> request_Q = new EventSemaphore<Param_T>();
   EventSemaphore<Return_T> response_Q = new EventSemaphore<Return_T>();
}

所以假设我们有一个看起来像这样的任务:

task serverTask is
   entry foo(x:integer) returns integer;
end serverTask;

task body serverTask is
...
begin
   loop
      select
         when guardOnFoo() =>
            accept foo(x) returns integer do
               ...
               return z; -- not sure if thats the correct syntax
            end foo;

可以实现为

public class serverTask extends Thread
{
  Entry<Integer,Integer> foo;   // EDIT: add missing ;

  public void execute()
  {
     while(true)  
     {
        int t;
        if (guardOnFoo() && null!=(t=foo.request_Q.peekWait()))
        {
           // an ada select- statement is actually just a series of if (peekWait()) statements.
           ...
           foo.response_Q.signal(z);
        }

然后进行客户端条目调用,例如

r := serverTask.foo(x);

成为

r = signalAndWait(serverTask.foo.request_Q,x,serverTask.foo.response_Q);

不幸的是,我不知道EventSemaphore的确切实现&lt;&gt;和peekWait()在我的头顶,但这是一般的想法(至少我理解它,我可能是错的:lol:)。