T. *_*cis 5 android java-threads
我有以下服务代码,我在其中启动了一个线程,负责在消息传入时分派消息。
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();
}
}
Run Code Online (Sandbox Code Playgroud)
但是当这段代码在我的 android 模拟器上运行时,我收到了很多如下警告:
Long monitor contention event with owner method=void com.foo.PrioritizedMessageQueue.run() from PrioritizedMessageQueue.java:58 waiters=0 for 585ms
Run Code Online (Sandbox Code Playgroud)
对我来说,这似乎是编写队列处理器的最有效方式。当没有消息要处理时,处理线程将等待直到添加一个,并且“添加”将通知任何等待的线程为什么将新消息添加到队列中。我的想法是当没有消息存在时调度线程不会使用最少的资源(因为它被阻塞)。
但是,android 发出此警告是有原因的,但我想知道为什么。我的线程被阻塞这么长时间显然不满意,但为什么这是一个问题?这不是更有效,因为它在等待时不会使用任何 CPU 周期吗?
另外,我是否应该担心 android 可能会因为我的线程被阻塞太久而杀死我的线程?我讨厌我的线程被杀死,而不是服务被杀死。如果我的服务被杀死,我可以处理,但我不能只处理一个线程被杀死。
您应该在调用之前释放队列上的锁_dispatcher.dispatch。_queue.add否则,当工作线程处理消息时,尝试调用的外部线程将被阻止。
只需调整花括号即可。这是您的run线程函数,已调整为允许dispatch在放弃 的监视器后调用_queue。
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) {
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4726 次 |
| 最近记录: |