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