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

时间:2011-06-05 18:12:54

标签: java multithreading methods

我有一个方法:

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) {
            }

        }
    }

祝你好运, Valter Henrique。

2 个答案:

答案 0 :(得分:0)

问题可能与“oisAO”有关吗?如果你的getPresentValue()在线程之外工作,它应该可以在新线程内部工作。这可能是你传递给函数的内容。

答案 1 :(得分:0)

为了清楚起见:当您使用.start()(使用多线程)调用代码时,您会收到异常并将threadAO.start()更改为threadAO.run()(无多线程)它运作正常吗?

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

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