2

在我的 j2me JAVA 应用程序中,有一个 Thread 初始化一个对象,之后我必须通过在其他类中返回它的值来获取它。

在我之后调用该线程的主类中,我必须获取在线程中更改的值,但问题是在线程完成之前调用该函数并且它返回 null 并且程序不会继续进行。

我所做的是将返回值等待,直到布尔状态在线程内没有变为真,但由于那个 while 循环,它挂在那里并且不会回来。

我发布下面的代码让我知道最好的解决方案,记住这段代码是在 J2me (Java) 中,即使是线程也有有限的功能,所以不要建议我使用 Latch 或 BackgroundWorker 之类的方法,因为它在这里不起作用。

这是hsa返回值的线程和其他函数

public synchronized void run() {
    try {
        contacts.removeAllElements();
        pim = PIM.getInstance();
        String lists[] = pim.listPIMLists(PIM.CONTACT_LIST);
        for (int i = 0; i < lists.length; i++) {
            //code for custom backup operation
            if (customCode == 1 && i == 0) {
                continue;
            } else if (customCode == 0 && i > 0) {
                continue;
            }
            clist = (ContactList) pim.openPIMList(PIM.CONTACT_LIST, PIM.READ_WRITE, lists[i]);
            Enumeration cenum = clist.items();
            while (cenum.hasMoreElements()) {
                Contact c = (Contact) cenum.nextElement();
                ContactDTO contact = new ContactDTO();
                parseContactInfo(c, contact);
                contacts.addElement(contact);
            }
            clist.close();
        }
        readComplete = true;
    } catch (Exception e) {
    }
}

//Return contacts loaded into vector list
public ContactVector getLoadedContacts() {
    while(!readComplete){
         Thread.sleep(100);
        }
     return contacts;
}

这是我必须调用它的主要课程

public ContactVector getContactVector() {
    DeviceContactRetriever dcr = new DeviceContactRetriever(this, language);
    dcr.start();
    ContactVector vector = dcr.getLoadedContacts();      //problem line*
    return vector;
}

所以 *problem 行在完成之前返回对象,因此它为空。

4

1 回答 1

-1

您的问题是代码不同步。

您需要使用方法wait()notify(),如下所示:

public synchronized void run() {
    try {
        contacts.removeAllElements();
        //...
        readComplete = true;
        this.notify();
    } catch (Exception e) {
    }
}

//Return contacts loaded into vector list
public synchronized // <-- note sync'd here
        ContactVector getLoadedContacts() {
    while(!readComplete){
         this.wait();
        }
     return contacts;
}

这是非常基本的东西,考虑学习 Java 并发教程。

如果可能的话,寻找早于 Java 5 的 Java 版本的教程,否则你可以在 Java ME(目前仅限于 Java 1.3)中使用的东西的解释将与现代特性“混合”,这使得学习这些部分变得更加困难。与您相关。

一个对我有用的示例教程是 Jacob Jenkov在这里,从“介绍......”到“滑倒条件”的章节包括在内。请注意,其他章节(“锁”和其他章节)也不错,但这些章节严重依赖自 Java 5 以来引入的功能(JSR 133 / 166 - JMM 和并发实用程序)。


对与上述错误无关的代码的几个观察。

  1. 由于您的代码非常复杂,请考虑添加日志消息以使其更易于调试(如此处所述)。特别是,我强烈希望在 catch 块中记录诸如异常之类的内容(如果您对为什么感兴趣,请在网上搜索类似 _Java 的内容,不要吞下异常),以及是否lists为空,如果不是,什么是它的大小以及 和 是否clistcenumc

  2. 考虑通过提取到单独的方法(如此处所述)中的代码来使您的代码更易于阅读和修改,这些代码在您的代码段内forwhile循环中。

  3. 请注意,由于代码getContactVector()可能需要很长时间才能运行,因此您最好避免从 UI 线程调用它。如果您有兴趣了解为什么会这样以及如何正确地做到这一点,请查看lcdui 标签 wiki中提到的教程“网络、用户体验和线程” 。

于 2013-01-18T09:54:28.027 回答