Java中的Ada会合对应程序

Java中的Ada会合对应程序,java,concurrency,synchronization,ada,Java,Concurrency,Synchronization,Ada,因此,在Ada编程语言中,集合是进程间同步/消息传递的一种方法。如何在java中实现这种机制(以及任务挂起和选择性等待)?我正在研究java的远程方法调用和交换器类,但我还没有找到合适的解决方案。不熟悉ada,但在ada rendezvous上快速搜索google表明,您可能正在寻找其中一种实现 如果您描述一下在传递消息时希望发生什么,我们可能会提供更多帮助。在Java中最难实现的部分是选择性等待和进入队列。阻塞队列是Ada中受保护条目的近似模拟,没有选择性等待 我不相信Java中有任何与Ada

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

不熟悉ada,但在ada rendezvous上快速搜索google表明,您可能正在寻找其中一种实现


如果您描述一下在传递消息时希望发生什么,我们可能会提供更多帮助。

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


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

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

可按以下方式实施:

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 = signalAndWait(serverTask.foo.request_Q,x,serverTask.foo.response_Q);

不幸的是,我不知道EventSemaphore和peekWait()的确切实现,但这是一般的想法(至少在我理解的情况下,我可能错了:lol:)。

考虑到Java的并发特性是低级的(而且容易出错),应该可以使用它们实现与Ada的高级并发功能等效的功能。问题是您的项目将允许您在上面花费多少精力。如果您确实需要集合语义,也许您应该估算在Ada、Java和presen中实现所需行为所需的时间我决定使用SynchronousQueue和(看起来)这是可行的。基本上,我有一个任务来实现一个8字形的轨道,在这个轨道上汽车可以繁殖并在上面运行。我必须确保它们不会在交叉口撞车。汽车线程向轨道进程打电话询问它们是否可以前进,如果两辆汽车到达交叉口,如果交叉口是e,则允许一辆随机的汽车通过空的。@kbijoch-很乐意帮忙,但你的描述听起来更像是在寻找a或a,但如果
SynchronousQueue
对你有用,那就去吧。是的,我知道,但我的教授特别告诉我们要实现Ada的会合。我不知道这是什么动机,但他说我的解决方案没问题,所以不管怎样。
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);