目录

1.问题

2.处理

3.方法

3.1vue前端 

3.2java后端

3.3多线程


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;
    }
}

 

Logo

前往低代码交流专区

更多推荐