2011-06-05 118 views
0

我有一个方法:Java:为什么在线程内不调用方法?

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

     } 
    } 

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

+3

通过调用线程中的方法是什么意思?我的猜测是这种方法从来没有被调用过。 – toto2 2011-06-05 18:17:43

+0

你能提供更多的代码吗?答案几乎肯定会是你的线程没有运行......我们只需要弄清楚为什么就是这样。 – stevevls 2011-06-05 18:18:40

+6

*所有*代码在一个线程中执行。你不能在线程之外调用一个方法。如果你可以展示一个简短但完整的程序来演示这个问题,那将会使生活变得相当容易...... – 2011-06-05 18:18:53

回答

0

问题出在“oisAO”上吗?如果你的getPresentValue()在线程之外工作,它可能应该在新线程中工作。这可能是你传递给函数的东西。

+0

它是套接字异常,在线程中给出: “com.serotonin.bacnet4j.exception.BACnetException:java.net.SocketException:套接字已关闭”但我不知道为什么关闭套接字,如果我打电话“ – 2011-06-05 19:02:37

+0

什么是”localDevice“?蓝牙? – 2011-06-05 19:23:05

+0

我对套接字知之甚少......我不知道是否有某些线程依赖于它们,但我会怀疑所以。getPresentValue'做什么? – toto2 2011-06-05 19:28:01

0

只是要清楚:当你打电话与.start()代码(多线程),你会得到一个异常,当你改变threadAO.start()threadAO.run()(无多线程),它正常工作?

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

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

相关问题