java thread ,return value from thread
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.
精彩评论