2011-06-05 38 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()(暫停當前線程,直到完成新線程)。

如果出現這個問題,您應該多考慮尋找正確的解決方案,因爲暫停原始線程可能會帶來一些性能問題。如果暫停該線程,它不是真正的多線程,但基本上只是代碼在兩個線程上按順序運行。

相關問題