方案:
我想测试两台设备之间的通信。他们按框架进行沟通。
我启动应用程序(在设备1 上)并发送一些帧(每个帧包含一个唯一的(int)ID)。 设备2 接收每个帧并发送确认(并且只是回显的ID)或不发送。 (当帧丢失时)
当设备1 收到ACK时,我想比较发送和接收ACK所需的时间。
从环顾四周来看 How do I measure time elapsed in Java? System.nanoTime()可能是监视已用时间的最佳方法。然而,根据经典的生产者 - 消费者模式,这一切都发生在不同的线程中,其中线程(在设备1 上)始终在读取,而另一个线程正在管理该过程(以及编写帧)。现在感谢您对我的承诺,我的问题是:
问题:现在出现问题:我需要将ACK帧中的唯一ID从读取线程传递到管理线程。我做过一些研究,这似乎是等待/通知系统的一个很好的候选人?或许我只需要一个包含每帧发送数据的共享数组?但管理线程如何知道它发生了?
背景我想比较这些时间,因为我想研究哪些因素会阻碍沟通。
答案 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