前后端通信:关于处理前端websocket 发送消息,后端java接收不到消息的问题,多线程跳出while循环
目录1.问题2.处理3.方法3.1vue前端3.2java后端3.3多线程1.问题最近在研究websocket前后端通信问题,需要前端输入数据,后端循环返回前端对应的数据如下图,前端输入S2,后端socket返回对应的数据但是在处理过程中发现当我收到消息后,while(true){...获取数据,调用send(),返回前端 ...}下一次我发送S1,后端因为还在执行上次的任务,接收不到我这次的请求
·
目录
1.问题
最近在研究websocket前后端通信问题,需要前端输入数据,后端循环返回前端对应的数据
如下图,前端输入S2,后端socket返回对应的数据
但是在处理过程中发现当我收到消息后,while(true){...获取数据,调用send(),返回前端 ...}
下一次我发送S1,后端因为还在执行上次的任务,接收不到我这次的请求参数,数据就没法更新成S1的数据
2.处理
经过思考,我将接收消息后处理数据返回前端的方法写到线程中,然后用一个标志位控制线程的关闭
这样当我下次执行的时候关闭上次的线程,开启一个新线程处理,每次请求相互不影响,就不会出现堵塞的现象,而且还是死循环的那种,哈哈哈
这个问题就涉及了利用多线程的标志位跳出while死循环的知识
3.方法
3.1vue前端
具体方法在我博客中《Spring Boot 系列:Vue+Sping Boot +WebSocket实现前后端消息推送》有详细记载,此处只处理问题
3.2java后端
websocket 见博客《Spring Boot 系列:Vue+Sping Boot +WebSocket实现前后端消息推送》
3.3多线程
package com.trgis.udp;
import com.trgis.util.UdpServerSocket;
import com.trgis.vo.SocketVO;
import java.io.IOException;
import java.util.ArrayList;
import static java.lang.Thread.sleep;
/**
* zoe
* 多线程标志位跳出循环
*/
public class MyRunnable implements Runnable {
//定义退出标志,true会一直执行,false会退出循环
//使用volatile目的是保证可见性,一处修改了标志,处处都要去主存读取新的值,而不是使用缓存
public volatile boolean flag = true;
public String message;
public MyRunnable(String message) {
this.message =message;
}
public void run() {
System.out.println("第" + Thread.currentThread().getId()+ "个线程创建");
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
int i=0;
//退出标志生效位置
while (flag) {
//省略处理过程
System.out.println(Thread.currentThread().getId()+"message "+message+i++);
}
}
public static void main(String[] arg) throws InterruptedException {
MyRunnable runnable = new MyRunnable("1");
//创建4个线程
for (int i = 0; i < 1; i++) {
Thread thread=new Thread(runnable,i+" ");
thread.start();
}
//线程休眠
Thread.sleep(2000L);
System.out.println("——————————————————————————");
//修改退出标志,使线程终止
runnable.flag = false;
}
}
更多推荐
已为社区贡献6条内容
所有评论(0)