【发布时间】:2018-01-20 09:43:37
【问题描述】:
我想实现一个单生产者 - 多消费者逻辑,其中每个消费者处理时间取决于硬件响应。
**编辑
我有一组对象(设备)。每个对象(device)对应一个我想在软件中模拟的硬件真实单元。
我的主类将任务列表分配给每个设备。每个任务都需要一定的时间才能完成——我想控制它,以模拟硬件操作。每个设备对象都有自己的SingleThreadExecutorService 服务执行器来管理自己的排队任务。特定设备对象任务上的Sleep不应干扰主设备对象或其他设备对象的性能。
到目前为止一切正常,但我不确定如何在不阻塞主线程的情况下从任务中获得未来(!future.isDone())。当我这样做时,会出现两个问题:
- 任务 1 提交给
device[ 1 ].executor。任务 1 休眠以模拟硬件操作时间。 - 任务 2 应该在任务 1 提交后立即提交给
device[ 2 ].executor,但它不会,因为主线程在等待任务 1 返回Future。这个问题会在模拟中累积延迟,因为添加的每个任务都会导致下一个设备必须等待前一个设备完成,而不是同时运行。
橙色线表示强制设备等待 1000 毫秒的命令。 当 Future 返回时,它会向设备 2 提交一个新任务,但它已经晚了 1 秒,如蓝线所示。以此类推,绿线表示延迟增量。
如果我不使用 Future 来获取任务完成的时间,模拟似乎运行正确。我找不到使用 future.isDone() 的方法,而不必创建一个新线程来检查它。另外,如果有人能建议我在这种情况下如何进行,我会非常高兴。
【问题讨论】:
标签: java multithreading thread-safety threadpoolexecutor