gpt4 book ai didi

android - "Long monitor contention event"有什么问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:13:36 26 4
gpt4 key购买 nike

我有以下服务代码,我在其中启动负责调度消息的线程。

       public void run() {
while (! Thread.interrupted()) {
try {
Message msg = null;
synchronized (_queue) {
if (_queue.size() == 0) {
_queue.wait(10000);
}

if (_queue.size() != 0) {
msg = _queue.poll();
}

if (msg != null) {
_dispatcher.dispatch(msg);
}
}
}
catch (InterruptedException i) { }
catch (Exception e) { }
}
}
public void add (final Message m){
if (m == null)
return;
synchronized (_queue){
_queue.add(m);
_queue.notify();
}
}

但是当这段代码在我的 android 模拟器上运行时,我收到了很多警告,如下所示:

Long monitor contention event with owner method=void com.foo.PrioritizedMessageQueue.run() from PrioritizedMessageQueue.java:58 waiters=0 for 585ms

对我来说,这似乎是编写队列处理器的最有效方式。当没有消息要处理时,处理线程将等待直到有新消息被添加,“添加”将通知任何等待线程为什么有新消息被添加到队列中。我的想法是,当不存在消息时(因为它被阻塞),调度线程不会使用最少的资源。

但是,android 发出此警告是有原因的,但我想知道为什么。它显然对我的线程被阻塞这么长时间不满意,但为什么这是一个问题?这不是更有效吗,因为它在等待时不会使用任何 CPU 周期?

此外,我是否应该担心 android 可能会因为阻塞时间过长而杀死我的线程?我讨厌我的线程被杀死而不是服务。如果我的服务被终止,我可以处理,但我不能只处理一个线程被终止。

最佳答案

您应该在调用 _dispatcher.dispatch 之前释放队列上的锁。否则,当工作线程正在处理消息时,试图调用 _queue.add 的外部线程将被阻塞。

只需调整花括号即可。这是调整后的 run 线程函数,以允许在放弃 _queue 的监视器后调用 dispatch

   public void run() {
while (! Thread.interrupted()) {
try {
Message msg = null;
synchronized (_queue) { // acquire the queue lock
if (_queue.size() == 0) {
_queue.wait(10000);
}

if (_queue.size() != 0) {
msg = _queue.poll();
}
} // release the queue lock

if (msg != null) {
_dispatcher.dispatch(msg);
}
}
catch (InterruptedException i) {
}
catch (Exception e) {
}
}
}

关于android - "Long monitor contention event"有什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41785665/

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