java 多线程,在主线程改变值,子线程接收不到

/*主线程:在这里set一个值进去ClientOutputThread*/

private void submit() throws UnknownHostException, IOException{
String account = accounts.getText().toString();
String password = LoginActivity.this.password.getText().toString();
ClientOutputThread out = new ClientOutputThread();

TranObject<User> msg = new TranObject<User>(TranObjectType.LOGIN);
User user = new User();
user.setName(account);
user.setPassword(password);
msg.setObject(user);
out.setMsg(msg);//在这里set一个值
}

/子线程接收类/
public class ClientOutputThread extends Thread {

private TranObject msg;
private ObjectOutputStream out;
private Socket socket;
public ClientOutputThread(){}
public ClientOutputThread(Socket socket){
this.socket = socket;
try {
out = new ObjectOutputStream(socket.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run(){
try{
while(isStarted){
if(msg != null){
out.writeObject(msg);
out.flush();
msg = null;
}
}
out.close();
if(socket != null){
socket.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
public void setMsg(TranObject msg) {
this.msg = msg;
}
}
在子线程的while循环里面的msg还是等于null

子线程没有调起来,应该用out.start().
另外在子线程中isStarted的值没有看到是在哪里设的,应该是true。
如果isStarted是在外面设置的,请注意,应该在start以前设置追问

线程里私有变量的值是不是一定要在start以前设置的,怎么在别的线程里改变他的值呢

追答

私有变量不必一定要在start前设置的,要看你的程序是怎么设计了。要考虑线程的同步问题。
举例:假设线程中的变量private int i = 0; 在线程开始以后,如果在线程外去设置i 的值为2,那么在线程中可能得不到2的值,因为有可能线程已经取了默认值。
如果想在其他线程中改变这个值,要注意线程的同步这样才能保持数据的一致。可以通过synchronized
public void setValue(int i) {
this.i = i;

}

追问

public void setValue(int i) {
this.i = i;
}
那如果我要在别的线程改i的值,我该怎么写呢

追答

out.setI(3);

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-03-13
子线程都没start啊...追问

我在应用一启动的时候就连接了

if(client.isConnected()){
out = new ClientOutputThread(client);
out.setStarted(true);
out.start();
}

追答

你这段在什么地方啊,在别处的话,明显用了两个子线程对象,启动的这个里面的msg根本没有设值...

追问

我是在一个子线程里面启动ClientOutputThread线程的,因为socket我是用一个子线程来启动的

第2个回答  2014-03-13
我记得主线程跟子线程交互最牛b的办法就是把那个变量声明成public static 屡试不爽。
之所以收不到是因为你的子线程已经死锁在while那里了,是不会去读那个msg的吧。
相似回答