Java子线程如何返回一个得到结果的字符串给主线程呢?

-GSC 2019-12-27 09:29:51
做的一个socket聊天室程序,然后子线程从服务器获取到了字符串后,想从子线程返回主线程显示在面板上,但是,我试了在子线程加get方法,结果返回的是null,也试了在主线程中判断为空就让主线程睡眠一段时间,但这个方法在第一次有效,第二次再调用就又有返回null了
这是主线程的代码:

SocketThread_in sk = new SocketThread_in(socket);
Thread tt = new Thread(sk);
tt.start();

if(sk.getstr() == null){
try {
Thread.sleep(300);
textArea_mess.append(sk.getstr()+"\n");
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
textArea_send.setText("");

}

这是子线程的代码:
public class SocketThread_in implements Runnable {

public Socket socket;
public volatile String str;
public SocketThread_in(Socket socket){

this.socket = socket;
}
@Override
public void run(){
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while(true){
str = br.readLine()+"赋值成功";
System.out.println(str+"这里运行了");
}
}catch(Exception e){
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public String getstr(){
return str;

}
}
然后子线程那句测试输出的代码每次都能正确输出str得到的字符串,但是就是返回的时候就是null,请问这是怎么回事呢?
...全文
1124 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
maradona1984 2019-12-27
  • 打赏
  • 举报
回复
引用 9 楼 qq_46088763 的回复:
[quote=引用 5 楼 weixin_43869905 的回复:] 你加我qq 我没太懂你到底什么问题 私聊
试出来了,在定义Jtextarea定义成静态变量就行了,然后子线程调用直接把字符串打在文本框里面,是我想复杂了[/quote] 你这样做只是野路子而已,当然够用就好,多个窗口就会存在问题,还是回调的好,还有你对某项api的应用不了解,我建议你自行搜索,毕竟有些东西搜索出来的更系统,排版也更好
-GSC 2019-12-27
  • 打赏
  • 举报
回复
引用 5 楼 weixin_43869905 的回复:
你加我qq 我没太懂你到底什么问题 私聊

试出来了,在定义Jtextarea定义成静态变量就行了,然后子线程调用直接把字符串打在文本框里面,是我想复杂了
-GSC 2019-12-27
  • 打赏
  • 举报
回复
引用 7 楼 stacksoverflow 的回复:
在做得好一下的话,把消息封装成协议,客户端收到消息后拆分协议,根据不同的命令做不同的动作。

还没学这么深,不过还是谢谢了,我知道怎么弄了,直接把那个Jtestarea定义成静态变量就行了,再在子线程里面直接settext(str)就行了
stacksoverflow 2019-12-27
  • 打赏
  • 举报
回复
在做得好一下的话,把消息封装成协议,客户端收到消息后拆分协议,根据不同的命令做不同的动作。
stacksoverflow 2019-12-27
  • 打赏
  • 举报
回复
聊天程序的话,你的思路有些问题。 标准的是做一个监听接口,界面实现这个接口,socket收到消息就马上调用监听接口,把消息传给界面来处理。 伪代码参考一下:

public interface MessageListener{
	public void processMessage(String msg);
}

UI
public class XXX ... implements MessageListener{
	
	public void connectToServer(){
		ClientSocket clientSocket = new ClientSocket(this);
		clientSocket.start();
	}
	
	public void processMessage(String msg){
		// process your message
		System.out.println(msg);
	}
}

ClientSocket
public class ClientSocket implements Runnable ... {
	private messageListener messageListener;
	public ClientSocket(MessageListener messageListener){
		this.messageListener = messageListener;
	}
	
	public void run(){
		Socket client = new Socket("serverip", port);
		BufferedReader br = createBufferedReader(client);
		
		
		while(true){
			String msgLine = br.readLine();
			if(msgLine != null){
				messageListener.processMessage(msgLine);
			}
			
		}
	}
}
weixin_43869905 2019-12-27
  • 打赏
  • 举报
回复
你加我qq 我没太懂你到底什么问题 私聊
-GSC 2019-12-27
  • 打赏
  • 举报
回复
引用 3 楼 weixin_43869905 的回复:
public volatile String str; 加上static 变成静态变量. 就可以了

还是不行,而且抛出了个空指针的错误
weixin_43869905 2019-12-27
  • 打赏
  • 举报
回复
public volatile String str; 加上static 变成静态变量. 就可以了
-GSC 2019-12-27
  • 打赏
  • 举报
回复
引用 1 楼 maradona1984 的回复:
如果一定要在主线程弄,那就用CountDownLatch.
实际情况下,一般还是用回调的好,作为服务器的主线程,都会有个循环在里面,你说的业务职责并不太可能在主线程跑.
你这代码貌似写着玩的,那就不用那么讲究,随意了

这是学校要求交的实训作业,才学了半年的Java搞了半天都没把这个值传过去,能不能讲一下CountDownLatch.这个是怎么个用法呢?
maradona1984 2019-12-27
  • 打赏
  • 举报
回复
如果一定要在主线程弄,那就用CountDownLatch. 实际情况下,一般还是用回调的好,作为服务器的主线程,都会有个循环在里面,你说的业务职责并不太可能在主线程跑. 你这代码貌似写着玩的,那就不用那么讲究,随意了

58,454

社区成员

发帖
与我相关
我的任务
社区描述
Java Eclipse
社区管理员
  • Eclipse
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧