gpt4 book ai didi

Java - 在一秒内多次调用包含 for 循环的方法会导致主线程的阻塞最小化

转载 作者:行者123 更新时间:2023-12-01 09:10:30 25 4
gpt4 key购买 nike

在我们的应用程序中,我们的界面之一有一个色轮。当用户快速拖动手指时,将调用色轮颜色调整回调 onColorChanged 。在 onColorChanged 内部,我们有一个 forloop,它根据发言者的数量循环 N 次。每次调用回调时。在 forloop 内部,我们从单例调用一个方法,该方法在单独的线程上执行任务。代码如下所示:

void onColorChanged
{
for(int i = 0; i < speakers.count)
{
//speaker connection is a thread which is kept alive as long as the connection between the app and the speaker is not terminated
SpeakerConnection connection = SpeakerConnectionManager.getConnectionForSpeakerWithID(speakerID);

connection.sendAdjustColorCommand();
}
}

现在,显然这不是我们真正的代码,而是我们的代码如何流动的大图。 onColorChanged 将被调用超过一百次,具体取决于用户拖动的速度。

这会导致 forloop 在几秒钟内被多次调用。我们怀疑这就是导致 UI 滞后的原因,因为当我们注释掉 forloop 时,一切都会顺利进行。

我们尝试的是:

void onColorChanged
{
new Thread(new Runnable()
{
for(int i = 0; i < speakers.count)
{
//speaker connection is a thread which is kept alive as long as the connection between the app and the speaker is not terminated
SpeakerConnection connection = SpeakerConnectionManager.getConnectionForSpeakerWithID(speakerID);

connection.sendAdjustColorCommand();
}
}).start();
}

每次调用 onColorChanged 时,我们都会启动一个新线程。但我们担心这会消耗大量内存,尽管我们知道完成其任务的线程将被自动杀死。但我们从内存分析器中看到内存峰值,并且不希望这种情况发生。

所以,我的问题是:

  1. 在主线程中多次调用forloop会导致UI卡顿?我的意思是,到目前为止,这只是一个不超过 10 次的循环。如果是 10000 次,我认为会,但事实并非如此。

  2. 如果每次调用回调时都实例化一个新线程确实不是一件好事,那么我们还有其他方法可以解决这个问题吗?

谢谢!

最佳答案

使用此代码可能会遇到的一个问题是,较早启动的线程被抢占并在较晚启动的线程之后完成的竞争。

正如您所说,使用大量内存是另一个后果。

我尝试在大小为 1 的 ThreadPoolExecutor 上使用 DiscardOldestPolicy 调度任务和有限的任务队列长度。因此,您可以限制内存需求并序列化运行顺序。

关于Java - 在一秒内多次调用包含 for 循环的方法会导致主线程的阻塞最小化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40947907/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com