用Java测试设备间通信时序

时间:2013-08-01 13:20:43

标签: java multithreading

方案

我想测试两台设备之间的通信。他们按框架进行沟通。

我启动应用程序(在设备1 上)并发送一些帧(每个帧包含一个唯一的(int)ID)。 设备2 接收每个帧并发送确认(并且只是回显的ID)或不发送。 (当帧丢失时)

设备1 收到ACK时,我想比较发送和接收ACK所需的时间。

从环顾四周来看 How do I measure time elapsed in Java? System.nanoTime()可能是监视已用时间的最佳方法。然而,根据经典的生产者 - 消费者模式,这一切都发生在不同的线程中,其中线程(在设备1 上)始终在读取,而另一个线程正在管理该过程(以及编写帧)。现在感谢您对我的承诺,我的问题是:

问题:现在出现问题:我需要将ACK帧中的唯一ID从读取线程传递到管理线程。我做过一些研究,这似乎是等待/通知系统的一个很好的候选人?或许我只需要一个包含每帧发送数据的共享数组?但管理线程如何知道它发生了?

背景我想比较这些时间,因为我想研究哪些因素会阻碍沟通。

2 个答案:

答案 0 :(得分:1)

为什么不用<unique id, timestamp>对填充共享地图?您可以通过定期删除超过特定金额的条目来使旧条目到期。

答案 1 :(得分:0)

我建议您使用任务(Callable)重新制定问题。为writer创建一个任务,为reader角色创建一个任务。在ExecutorService中成对提交这些,并让Java并发框架为您处理并发。您只需要考虑任务的结果以及您希望如何使用它。

// Pseudo code
ExecutorService EXC = Executors.newCachedThreadPool();
Future<List<Timestamp>> readerFuture = EXC.submit(new ReaderRole(sentFramwNum));
Future<List<Timestamp>> writerFuture = EXC.submit(new WriterRole(sentFrameNum)); 

List<Timestamp>  writeResult = writerFuture.get(); // wait for the completion of writing
List<Timestamp> readResult = readerFuture.get(); // wait for the completion of reading

这是非常复杂的东西,但是比定制开发的同步解决方案更清晰,更稳定。

以下是Java并发框架的一个非常好的教程:http://www.vogella.com/articles/JavaConcurrency/article.html#threadpools