Java Android中的消费者-生产者模式,提高性能的一些建议?
在Android上,我有一个普通的消费者-生产者场景:Java Android中的消费者-生产者模式,提高性能的一些建议?,java,android,multithreading,performance,producer-consumer,Java,Android,Multithreading,Performance,Producer Consumer,在Android上,我有一个普通的消费者-生产者场景: 不同的生产者线程可以将对象添加到中的列表中 不同时间 当某个事件(触发事件)发生时 消费者开始从列表中保留元素(只有一个 线程消费者 当列表为空时,消费者将停止 从列表中保留元素 一旦列表不是空的 使用者必须从列表中选择元素 消费者必须 一旦元素插入列表中,就要快速保存数据 从生产者那里,消费者必须保留它 我有这个 在一个单例场景中,只有当应用程序 这是关机 * 其中一个生产者有时是UI线程 * 您建议使用哪种类型的同步和列表?我会在不浪费
Thread C producer : calls EventTracker.trackEvent( C )
UI producer : calls EventTracker.trackEvent( A )
EventTracker
{
BlockingQueue<Event> blockingQueue
trackEvent(Event x)
{
blockingQueue.offer(500, ms);
}
Thread consumer
{
while(true){
Event p = blockingQueue.poll(100, ms);
}
}
}
线程C生产者:调用EventTracker.trackEvent(C)
UI生产者:调用EventTracker.trackEvent(A)
事件跟踪器
{
阻塞队列阻塞队列
trackEvent(事件x)
{
阻塞队列。提供(500,毫秒);
}
线程消费者
{
while(true){
事件p=blockingQueue.poll(100毫秒);
}
}
}
如果在trackEvent(A)上触发超时,UI生产者没有等待很长时间,但没有错过事件“A”?您可以尝试通过排队和使用类似的实现来解决此问题
在您的情况下,生产者插入事件通过使用“offer”在队列中插入,消费者通过使用“poll”接收事件。(当用户退出应用程序时,使用这些方法上的超时退出生产者/消费者)
请注意,在使用这种方法时,在线程方面需要做一些正确的事情
这是android开发者文档中的一个例子。Hi@Alex!谢谢你的时间:)我必须学习seda方法,但是如果制作人在阻塞队列上等待很长时间(因为ui线程在他们身上),我会非常害怕,我不能错过任何活动。当用户退出应用程序时,您建议我以何种方式使用“提供超时”和“轮询队列”来很好地退出?您好@aeroxr1,不要害怕,当超时过期时,obect为空,因此您可以实现任意多的行为,我们的目标是,计时器大约为100毫秒到500毫秒,这取决于您的制作者和您希望用户体验的方式。但是,如果超时太短,我会丢失一些事件,另一方面,如果超时太长,我可能会长时间锁定ui制作者或任何其他制作者。此外,我不明白当用户退出应用程序时,我能以什么方式理解,以确保我能退出线程(我必须学习英语-。-”)这不是此模式的含义,如果超时超时,这只意味着队列是空的,如果您循环并重试,您将捕获队列中的下一个事件。对于生产者,只有当队列已满时,报价才会阻塞(因此,请确保至少有一定的容量…)这意味着如果你的消费速度足够快,那么排队的人就永远不会“满员”。你应该认真阅读维基百科关于SEDA和生产者/消费者如何工作的帖子(包括阅读线程和事件循环)。哇,太可爱了……让我们说答案就在“退出”中按钮或应用程序的条件,如果处理应用程序“退出事件”的代码知道消费者和生产者队列,则它可以“将蓝色药丸传递”到队列,杀死消费者,或者只调用函数向消费者发出退出信号。所有这些都在您如何在消费者和生产者中处理事件循环的代码中。因此,如果您只是在消费者队列中循环,而不进行任何健全检查,如“我必须退出吗?”或“我必须做一些不同寻常的事情吗?”。