0

场景

我想测试两台设备之间的通信。它们通过帧进行通信。

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

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

从环顾四周 ,我如何测量 Java 中经过的时间? System.nanoTime() 可能是监视经过时间的最佳方法。然而,根据经典的生产者-消费者模式,这一切都发生在不同的线程中,其中一个线程(在设备 1上)始终在读取,而另一个线程在管理进程(并且还写入帧)。现在感谢您对我的支持,我的问题是:

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

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

4

2 回答 2

1

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

于 2013-08-01T13:24:36.640 回答
0

我建议你用任务(Callable)重新表述你的问题。为作者创建一个任务,为读者角色创建一个任务。成对提交这些,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

于 2013-08-01T13:58:23.147 回答