开发者

java thread ,return value from thread

开发者 https://www.devze.com 2023-02-18 02:43 出处:网络
i am new to threading ,this is my code inmain method i have a thread that process some value then i set the value to getResult() method. now i am try to get that value but i am getting null

i am new to threading ,this is my code in main method i have a thread that process some value then i set the value to getResult() method. now i am try to get that value but i am getting null

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

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

result is

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  serialP开发者_开发百科ort=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())

actually the object calls first main method and then getResult but as main method has a thread that set vale for getReult it take some time before that jvm call getResult method and prints null value i want that first the main method completes then getResult method is called. or any way from which i return value from my run method


Your class RS232Example has a member field String threadResult which is returend on getResult. However, this field is only written to in method Result (btw it is not a good idea to start method names with capital letters) but this method itself is never called in any of your code.


Can you please elaborate your question. It is not giving clear idea of what problem you are having. I think, You have not set the value properly. As getResult() is returning a "null" object. Let us know what processing you are doing to get the value.


It looks like you are setting the result after you are accessing it. i.e. you don't wait for the result to be set.

I suggest you consider using a Callable<String> and an ExecutorService. This will allow you to wait for the result using a builtin library.

Another option is not to do this in the background at all. You don't appear to benefit from having more than one thread, it appears to just add complexity.

0

精彩评论

暂无评论...
验证码 换一张
取 消