Java 中的 Ada 会合对应方

Ada rendezvous counterpart in Java

所以在 Ada 编程语言中,集合点是进程间的一种方法 synchronization/message-passing。如何在 java 中实现此机制(以及任务挂起和选择性等待)?我正在查看 java 的远程方法调用和 Exchanger class,但我还没有找到合适的解决方案。

不熟悉 ada,但 google ada 会合点 表明您可能正在寻找 BlockingQueue implementations, possibly SynchronousQueue.

之一

也许如果您描述传递消息时希望发生的情况,我们可以提供更多帮助。

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

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

您需要一个带有 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<> 和 peekWait() 的确切实现,但这是一般的想法(至少据我所知,我可能是错的:lol:)。