2011-03-22 76 views
0

我是線程新手,這是我在主要方法中的代碼,我有一個線程處理一些值,然後我將值設置爲getResult()方法。現在我試圖獲取的價值,但我得到空java線程,線程返回值

RS232Example rs232= new RS232Example(); 
rs232.main() 

System.out.println("value after RS232::"+rs232.getResult()) 

結果是

value after RS232::null 
call 
call 
call 
call 
call 
call 
call 
call 
call 
call 
call 
0 
:: 0 
::::?? 0 
call 




public class RS232Example implements rs232Weight{ 

    private String threadResult; 

    public void Result(String result) { 
     threadResult = result; 

    } 
    public String getResult() { 
      return threadResult; 
    } 

     public synchronized void connect(String portName) throws Exception { 

      CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName); 
      SerialPort serialPort=null; 
      if (!portIdentifier.isCurrentlyOwned()) { 
      serialPort = (SerialPort) portIdentifier.open("RS232Example", 2000); 

       // setup connection parameters 
       // set the parameter for machine 

       serialPort.setSerialPortParams(
         9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_EVEN); 
       // setup serial port writer 
       CommPortSender.setWriterStream(serialPort.getOutputStream()); 

      // setup serial port reader 
      CommPortReceiver obj = new CommPortReceiver(serialPort.getInputStream(),serialPort); 

      obj.start(); 

      } else { 
       // points who owns the port and connection timeout 
      System.out.println("Port in use!"); 
       try{ 
        portIdentifier=null; 
       } 
       catch(Exception e){ 
        System.out.println("error"+e); 
       } 
      } 
     } 

    public void main() throws Exception{ 

      // connects to the port which name (e.g. COM1) is in the first argument 
     connect("COM1"); 

      // send HELO message through serial port using protocol implementation 
      CommPortSender.send(new ProtocolImpl().getMessage("HELO")); 
     } 
    } 

==============

package com.indivar.cmcs.machine; 
import gnu.io.SerialPort; 
import java.io.IOException; 
import java.io.InputStream; 

    public class CommPortReceiver extends Thread{ 
    // public rs232Weight weightRs232; 
    // RS232Example rs232= new RS232Example(); 
     SerialPort serialPort=null; 
     String value; 
     InputStream in; 
     Protocol protocol = new ProtocolImpl(); 
     rs232Weight weightRs232= new RS232Example(); 
     private volatile boolean stopRequested=false; 
     public CommPortReceiver(InputStream in,SerialPort serialPort) { 
      this.in = in; 
      this.serialPort=serialPort; 

     } 
     int i=10; 
     public void stopRequest() { 
      stopRequested = true; 
      serialPort.close(); 
      } 
     public void run() { 
      try { 
       int b; 
      // System.out.println("f"); 
      while(!stopRequested) { 

        // if stream is not bound in.read() method returns -1 
        while((b = in.read()) != -1) { 
        String val=protocol.onReceive((byte) b); 

         if (val.equals("0")){ 
          // System.out.println("::::??"+val); 
         } 
         else{ 
          value=val; 
         //.setWeight(value); 
          System.out.println("::::??"+val); 
         stopRequest(); 
          weightRs232.Result(val); 
        break; 
         } 
         Thread.sleep(100); 
        //  
        } 

        protocol.onStreamClosed(); 

        // wait 10ms when stream is broken and check again 
       i--; 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
} 


================== 


RS232Example rs232= new RS232Example(); 
     rs232.main() 

     System.out.println("value after RS232::"+rs232.getResult()) 

實際上,該對象調用第一個主要方法,然後getResult,但作爲主要方法有一個線程,爲getReult設置VAL值,它需要一段時間之前,該jvm調用getResult方法和打印空值我希望首先完成主方法,然後調用getResult方法。或任何方式,我從我的運行方法返回價值

+1

可以請你告訴**相關代碼** – 2011-03-22 05:45:16

回答

0

請你詳細說明你的問題。它沒有清楚地知道你有什麼問題。我認爲,你沒有正確設定價值。由於getResult()返回一個「null」對象。讓我們知道你正在做什麼處理來獲得價值。

+0

實際上對象調用第一主方法,然後的getResult但 – user670600 2011-03-22 07:35:46

1

您的等級RS232Example有一個成員字段String threadResult這是getResult returend。然而,這個字段只寫入方法Result(順便說一句,用大寫字母開始方法名不是一個好主意),但是這個方法本身在任何代碼中都不會被調用。

+0

您好,感謝烏拉圭回合的答覆和建議,但我所說的功法weightRs232.Result(VAL); – user670600 2011-03-22 07:31:32

+0

但我看不到你等待你的線程完成。 – Howard 2011-03-22 07:36:00

+0

是的,我是新來的線程,你能幫我怎麼做 – user670600 2011-03-22 07:52:34

0

看起來您在設置結果後,您正在訪問它。即您不等待結果被設置。

我建議你考慮使用一個Callable < String>和一個ExecutorService。這將允許您使用內置庫等待結果。

另一種選擇是不要在後臺執行此操作。你看起來並不能從多個線程中受益,它似乎只是增加了複雜性。