Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android中的消费者-生产者模式,提高性能的一些建议?_Java_Android_Multithreading_Performance_Producer Consumer - Fatal编程技术网

Java Android中的消费者-生产者模式,提高性能的一些建议?

Java Android中的消费者-生产者模式,提高性能的一些建议?,java,android,multithreading,performance,producer-consumer,Java,Android,Multithreading,Performance,Producer Consumer,在Android上,我有一个普通的消费者-生产者场景: 不同的生产者线程可以将对象添加到中的列表中 不同时间 当某个事件(触发事件)发生时 消费者开始从列表中保留元素(只有一个 线程消费者 当列表为空时,消费者将停止 从列表中保留元素 一旦列表不是空的 使用者必须从列表中选择元素 消费者必须 一旦元素插入列表中,就要快速保存数据 从生产者那里,消费者必须保留它 我有这个 在一个单例场景中,只有当应用程序 这是关机 * 其中一个生产者有时是UI线程 * 您建议使用哪种类型的同步和列表?我会在不浪费

在Android上,我有一个普通的消费者-生产者场景:

  • 不同的生产者线程可以将对象添加到中的列表中 不同时间
  • 当某个事件(触发事件)发生时 消费者开始从列表中保留元素(只有一个 线程消费者
  • 当列表为空时,消费者将停止 从列表中保留元素
  • 一旦列表不是空的 使用者必须从列表中选择元素
  • 消费者必须 一旦元素插入列表中,就要快速保存数据 从生产者那里,消费者必须保留它
  • 我有这个 在一个单例场景中,只有当应用程序 这是关机
  • *

  • 其中一个生产者有时是UI线程
  • * 您建议使用哪种类型的同步和列表?我会在不浪费cpu负载的情况下这样做

    我害怕第7点。我不想在很长时间内阻止UI线程

    编辑:为@Alex添加详细信息

    我是用伪代码写的:

    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和生产者/消费者如何工作的帖子(包括阅读线程和事件循环)。哇,太可爱了……让我们说答案就在“退出”中按钮或应用程序的条件,如果处理应用程序“退出事件”的代码知道消费者和生产者队列,则它可以“将蓝色药丸传递”到队列,杀死消费者,或者只调用函数向消费者发出退出信号。所有这些都在您如何在消费者和生产者中处理事件循环的代码中。因此,如果您只是在消费者队列中循环,而不进行任何健全检查,如“我必须退出吗?”或“我必须做一些不同寻常的事情吗?”。