`
wayfarer
  • 浏览: 297755 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

警告: 若要避免潜在的死锁, 应该在 commandAction() 处理程序之外的其他线程中执行

阅读更多

要弄清楚这个警告的由来,就需要先理解MIDP的UI事件处理机制。MIDP的Java Doc中,可以从javax.microedition.lcdui包的Overview里找到一段标题为“Event Handling”的内容,这段内容很有帮助,以下是对其中部分内容的翻译和理解。

用户交互会产生事件,虚拟机通过回调相应的方法将事件通知到应用程序。UI中的回调方法有以下几种:
(1) High-Level API中的抽象命令;
(2) Low-Level API中的按键和触屏事件(keyPressed、keyReleased等);
(3) Canvas中的paint()方法;
(4) 通过Canvas的callSerially()方法请求执行的Runnable接口;

所有的UI回调方法都是顺序执行的,它们永远都不会并行。虚拟机永远不会在一个回调方法返回前调用其他回调方法。这个特性可以很好的保证旧的事件在新事件被传递之前完成。如果多个回调都在等待执行,则后一个回调会在前一个回调返回后尽可能快的被执行。

前面的警告的原因已经很清楚了,如果commandAction()方法因被网络连接操作阻塞而无法返回,则其他回调方法都会因此阻塞。

实际开发中,回调方法应被保证尽可能快的返回,不在其中执行可能阻塞或需要大量运行时间的操作,这样才能保证事件处理的流畅度。

如下的方法都是UI中的回调方法:
Canvas.hideNotify
Canvas.keyPressed
Canvas.keyRepeated
Canvas.keyReleased
Canvas.paint
Canvas.pointerDragged
Canvas.pointerPressed
Canvas.pointerReleased
Canvas.showNotify
Canvas.sizeChanged
CommandListener.commandAction
CustomItem.getMinContentHeight
CustomItem.getMinContentWidth
CustomItem.getPrefContentHeight
CustomItem.getPrefContentWidth
CustomItem.hideNotify
CustomItem.keyPressed
CustomItem.keyRepeated
CustomItem.keyReleased
CustomItem.paint
CustomItem.pointerDragged
CustomItem.pointerPressed
CustomItem.pointerReleased
CustomItem.showNotify
CustomItem.sizeChanged
CustomItem.traverse
CustomItem.traverseOut
Displayable.sizeChanged
ItemCommandListener.commandAction
ItemStateListener.itemStateChanged
Runnable.run resulting from a call to Display.callSerially

分享到:
评论
1 楼 wayfarer 2009-06-29  
GCF(general connection framework, 通用连接框架, 用来处理io的: 有蓝牙、网络连接、文件系统读取等)都要单独线程处理,包括jsr75中的FileConnection,

相关推荐

    线程死锁的例子

    这个概念在计算机科学中尤为重要,因为并发执行是提高系统性能的关键手段,但如果不妥善处理,死锁可能导致整个程序停滞不前。 在我们的例子“ConsoleApplication1”中,很可能包含了一个模拟线程死锁的简单控制台...

    java源码:Java多线程程序死锁检查 JCarder.zip

    死锁是指两个或多个线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉它们都将无法推进下去。本资料“Java多线程程序死锁检查 JCarder.zip”提供了帮助开发者检测Java程序中死锁情况的工具——...

    进程线程及死锁

    在实验中,我们使用互斥锁来避免死锁的发生。互斥锁是指一种机制,它可以防止多个进程同时访问同一个共享资源。通过使用互斥锁,我们可以避免死锁的发生,从而提高系统的稳定性。 理解进程、线程和死锁的概念对于...

    java模拟线程死锁

    这种情况下,各个线程都在等待其他线程释放资源,而自己也占用着其他线程需要的资源,从而导致所有线程都无法继续执行的情况。 线程死锁的原因 线程死锁的原因主要有两个: 1. 资源竞争:多个线程都需要访问同一...

    DllMain和多线程死锁[归类].pdf

    在 DllMain 中创建线程或终止线程时,如果违背了 DllMain 的这个顺序调用规则,程序就会发生死锁。例如,在装载 DLL 时创建的线程,如果不遵守 DllMain 的顺序调用规则,可能会导致死锁。 装载 DLL 时创建的线程的...

    易语言将程序转换到线程中执行

    6. **性能优化**:在将程序转换到线程中时,要考虑负载平衡和资源分配,避免过度创建线程导致系统资源耗尽。 7. **线程优先级**:根据程序需求,可以设置线程的优先级,但应谨慎操作,以免影响其他线程或系统服务。...

    Java多线程程序死锁检查 JCarder

    JCarder是Java中用于检测多线程程序死锁的一款工具,它可以帮助开发者识别和避免死锁问题,提升程序的稳定性和效率。 首先,我们需要理解死锁的基本概念。在Java中,死锁通常发生在多个线程之间,每个线程持有某些...

    dump线程让死锁无处可逃

    在IT领域,尤其是在Java开发中,死锁是一个常见的问题,它会导致程序的执行停滞不前。本文将深入探讨如何利用“dump线程”这一技术来分析和解决死锁问题。我们将从以下几个方面来理解这个主题: 1. **什么是死锁**...

    Linux系统线程死锁实验报告.pdf

    临界区是指程序中访问共享资源的代码段,其执行过程中不允许其他线程打断。 6. 死锁的产生: 死锁是指两个或多个线程在执行过程中,因争夺资源而造成的一种僵局。本实验的线程函数`s`, `e`, `w`中设计了特定的执行...

    多线程介绍及如何避免死锁.zip

    在计算机科学领域,多线程是一种程序设计技术,它允许应用程序同时执行多个任务或子任务。这提高了系统资源的利用率,特别是在多核处理器系统中,每个线程可以在一个单独的处理器核心上运行,从而实现真正的并行处理...

    死锁,进程和线程实验报告

    死锁是指两个或多个并发进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉它们都将无法推进下去。死锁的四个必要条件包括互斥条件、请求与保持条件、不剥夺条件和循环等待条件。在实验中,我们...

    多线程死锁问题

    在Java多线程编程中,死锁是一个非常重要的概念,也是开发者需要密切关注和避免的问题。死锁是指两个或多个线程互相等待对方释放资源,从而导致它们都无法继续执行的状态。这种情况通常发生在并发环境中,当线程间的...

    java多线程死锁预防机制研究

    死锁是指两个或多个线程在执行过程中,由于竞争资源或者彼此等待对方持有的资源而导致所有线程都无法继续执行的现象。本文旨在探讨Java多线程环境下的死锁问题,并提出有效的预防机制。 #### 1. 引言 在多线程环境...

    多线程死锁

    明白死锁产生的原因,在程序中演示死锁产生并从而实现多线程陈旭解决死锁(deadlock)这一类问题。

    矩阵在计算机线程死锁的检测与防止中的应用1

    【标题】:“矩阵在计算机线程死锁的检测与防止中的应用1” 【主题】:本文探讨了在多线程操作系统中如何利用矩阵方法来检测和预防死锁问题。死锁是多进程环境下常见的问题,当多个进程互相等待对方持有的资源而...

    在MFC 子线程中使用UI(控件)退出时死锁或者超时处理参考

    在MFC(Microsoft Foundation Classes)框架中,子线程与主线程交互并操作用户界面(UI)时,可能会遇到一些特定的问题,特别是当涉及到退出、死锁或超时的情况。以下是对这些知识点的详细说明: 1. **MFC 子线程**...

    C++(Qt)软件调试-线程死锁调试(15)

    在C++编程中,特别是在使用Qt进行多线程开发时,死锁是一个常见的问题,它会导致程序无法继续执行。死锁通常发生在两个或多个线程互相等待对方释放资源的情况下。解决这个问题需要对线程同步机制有深入理解,并掌握...

    将程序转换到线程中执行源码

    在IT行业中,线程是操作系统调度的基本单位,它允许程序中的不同部分并行运行,从而提高了应用程序的响应速度和效率。在多核处理器系统中,线程的优势更加明显,因为每个核心可以同时处理一个或多个线程。"将程序...

    lookcop 线程死锁检测工具

    线程死锁是多线程编程中常见的问题,它发生在两个或多个线程相互等待对方释放资源而无法继续执行的情况。Lookcop是一款专门用于检测线程死锁的工具,对于保证程序的稳定性和效率至关重要。在Java等支持多线程的语言...

Global site tag (gtag.js) - Google Analytics