繁体   English   中英

Java:为什么在线程内部没有调用方法?

[英]Java: Why method is not called when inside the thread?

我有一个方法:

public String getPresentValue(ObjectIdentifier oid) throws Exception {
    ReadPropertyRequest rpr = new ReadPropertyRequest(oid, PropertyIdentifier.presentValue);
    ReadPropertyAck rpa = (ReadPropertyAck) localDevice.send(isa, null, 1476, Segmentation.segmentedBoth, rpr);

    return rpa.getValue().toString();
}

当我在线程外部调用它时,它工作得很好,但是当我尝试在线程内部调用它时,什么也没有发生。

为什么会发生这种情况?

更新:

public void active(Supervisory supervisory) {

       //.. my code above is just simple maths

        System.out.println("presentValue in the thread" + getPresentValue(oi));


        ScanAO scanAO = new ScanAO();

        Thread threadAO = new Thread(scanAO);
        threadAO.start();

    } catch (IOException ioe) {
        ioe.printStackTrace();

    } catch (Exception ex) {
        ex.printStackTrace();
    }

}


    class ScanAO extends Thread {

        public void run() {
            try {

                for (ObjectIdentifier oi : oisAO) {
                    System.out.println("presentValue in the thread" + getPresentValue(oi));
                }

            } catch (Exception e) {
            }

        }
    }

最好的问候,瓦尔特·恩里克。

问题可能出在“oisAO”上吗? 如果您的 getPresentValue() 在线程外工作,它可能应该在新线程内工作。 这可能是您传递给 function 的内容。

需要明确的是:当您使用.start() (使用多线程)调用代码时,会出现异常,而当您将threadAO.start()更改为threadAO.run() (没有多线程)时,它是否可以正常工作?

可能oisAO在线程之间不同步:原始线程在.start( .start()创建的新线程可以完成工作之前修改了oisAO的state(关闭套接字)。 要确定这是否是问题所在,您可以尝试在 threadAO.start() 之后添加一个threadAO.join() (暂停当前线程直到新线程完成threadAO.start()

如果这是问题所在,您应该多考虑一下以找到正确的解决方案,因为仅暂停原始线程可能会给您带来一些性能问题。 如果您暂停线程,它并不是真正的多线程,而基本上只是在两个线程上顺序运行的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM