java - 放入静态 map 时的非静态变量 this

标签 java static

我有一个静态 HashMap,我要向其中添加一个新项目,如下所示:

public static void addSession(Session session) {
    if(!map.containsKey(session)){
        map.put(session, new SessionThread(session));
    }
}

SessionThread 在本地声明如下:

public class SessionThread implements Runnable {

map.put 行有一个编译错误 non-static variable this cannot be referenced from a static context。是什么导致了错误? this 在该方法的任何地方都没有被引用,更不用说任何非静态成员了。一切要么是静态的,要么在方法的范围内。

全类...

package me.scratchjava;

import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Queue;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.websocket.RemoteEndpoint;
import javax.websocket.Session;

/**
 * A class for managing websocket threads.
 * @author James Smyth <jimsmyth at datafascia.com>
 */
public class SessionManager {

    private static HashMap<Session, SessionThread> map = new HashMap<>();

    /**
     * Called whenever a new websocket is opened.
     * @param session 
     */
    public static void addSession(Session session) {
        if(!map.containsKey(session)){
            map.put(session, new SessionThread(session));
        }
    }

    public static void removeSession(Session session){
        if(map.containsKey(session)){
            map.remove(session);
        }
    }

    public static void sendData(Session session, byte[] bytes){
        if(map.containsKey(session)){
            map.get(session).send(bytes);
        }
    }

    public class SessionThread implements Runnable {
        private Session session;
        private boolean alive = true;
        private final LinkedList<byte[]> messageQueue = new LinkedList<>();

        public SessionThread(Session session){

        }

        @Override
        public void run() {
            while (alive) {
                if(Thread.interrupted()){
                    alive = false;
                    return;
                }

                synchronized (messageQueue) {
                    while(!messageQueue.isEmpty()){
                        byte[] msg = messageQueue.poll();
                        try {
                            session.getBasicRemote().sendBinary(ByteBuffer.wrap(msg));
                        } catch (IOException ex) {
                            Logger.getLogger(SessionManager.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    }
                }
            }
        }

        public void send(byte[] bytes) {
            synchronized (messageQueue) {
                messageQueue.add(bytes);
            }
        }

        public void kill(){
            alive = false;
        }
    }
}

最佳答案

您的SessionThread 内部类不是是静态的。这意味着编译器生成一个构造函数来捕获封闭类 this 的值。由于您试图在静态方法中创建一个新的 SessionThread,因此没有要捕获的 this。使类静态化。

关于java - 放入静态 map 时的非静态变量 this,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25395753/

相关文章:

java - 如何控制嵌套ArrayList的结构

Java 文件错误,因为\

c# - 在 TPL 中返回一个空的静态任务是一种不好的做法吗?

ios - Swift - 管理静态字符串和常量(如 URL、ID、图像名称等)的最佳方法是什么

java - Jar 文件在 Windows 上运行但不显示 GUI

java - java中的文本转图像

java - 根据属性对 Map 进行排序

c# - 如何声明一个全局使用的变量

java - 等效静态和非静态方法的速度差异很大

c++ - 静态类 C++