放入静态地图时非静态变量

时间:2014-08-20 02:15:37

标签: 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;
        }
    }
}

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)


修改

@directedition:SessionThread应该是一个静态类。实际上它应该是一个独立的界面和类。