[英]Wait for resource to get free
让我描述一下上述情况:
函数startAssembly():
if(queue.size()==0 && wait.size()>=1 && resourcePool.idle()>=1){
wait.free(wait.get(0));
}
System.out.println("Queue: " + queue.size());
System.out.println("Wait: " + wait.size());
System.out.println("Idle: " + resourcePool.idle());
函数startAssembly(); 叫做:
我要发生的事情:对具有通过队列(FIFO)连接的两个流程的装配线进行建模。 进程1(汇编程序)比进程2(延迟)快。 因此,queueSize1已填满,并且在进程1完成第二部分之后,它将无法继续工作。 由于代理无法离开汇编器,因此通常将工作器显示为busy()。 我希望使用函数,等待和排队时将其显示为idle()。
发生的情况:一个代理程序通过了汇编程序,此后,其他任何代理程序都无法通过等待块。 通过收集resourcePool.idle(),我注意到,即使代理程序退出了组装块,也没有空闲资源。 我还在if部分中尝试了类似assembler.delaySize()==0
的构造,但也有一些奇怪的行为。 可以用delaySize-part代替空闲部分,但也可以将2或3个代理传递到汇编块中。 因此,“生产线”包含的工件数量超过了应有的数量。
问题:这是汇编块的正常行为吗? 是否有可能避免这种情况并获得正确的idle()数量? 还有其他可能的方式来为我的“生产线”建模吗?
如果您在同时发生的事件中使用LIFO作为选择模式,则此解决方案有效,在这种情况下,代理将从汇编器移至队列,然后移至queueSize1,然后移至延迟(均在零时间内),然后资源被释放...。这有点违反直觉,但是这就是在LIFO选择模式下事情的工作方式。
因此,您要做的是创建一个称为StartAssembly的动态事件,并在该动态事件内调用函数: startAssembly();
然后,在汇编器的出口处,您将调用动态事件以使其几乎立即运行:
create_StartAssembly(0.001);
这将确保资源被释放...并且满足所有条件。
您无需在其他地方执行相同的操作,只需在汇编器的出口处执行相同的操作
另外,我认为您应该在source1和汇编程序之间添加一个队列,否则可能会出错
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.