gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:17:57 25 4
gpt4 key购买 nike

我有一个静态 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com