gpt4 book ai didi

java - 将静态字段传递给线程

转载 作者:行者123 更新时间:2023-11-30 09:38:12 25 4
gpt4 key购买 nike

我用 Java 编写了一个小型 HTTP 服务器,但在将静态变量(服务器配置:端口、根目录等)传递给处理请求的线程时遇到了问题。我不希望我的线程修改这些变量,如果它扩展了服务器类,它也会继承我不想要的它的方法。

出于性能原因,我不想使用 setter/getter 。如果我将静态成员设为最终成员,那么从配置文件加载它们的值时就会出现问题。

举个例子

class HTTPServer {
static int port;
static File root;
etc..
....
//must be public
public void launch() throws HTTPServerException {
loadConfig();
while (!pool.isShutdown()) {
....
//using some config here
...
try {
Socket s = ss.accept();
Worker w = new Worker(s);
pool.execute(w);
}catch () {...}
}
}
private void loadConfig(){ //reading from file};
...
other methods that must be public goes here
}

我也不希望将 worker 作为嵌套类。它在另一个包中...

你有什么建议?

最佳答案

您可以将您的配置放在最终的 AtomicReference 中.然后它可以被您的工作人员引用并以线程安全的方式更新。

类似于:

class HTTPServer {
public static final AtomicReference<ServerConf> config =
new AtomicReference(new ServerConf());
}

制作新的ServerConf类不可变:

class ServerConf {
final int port;
final File root;
public ServerConf(int port, File root) {
this.port = port;
this.root = root;
}
}

然后您的工作人员可以通过HTTPServer.config.get() 获取对当前配置的引用.也许是这样的:

Worker w = new Worker(s, HTTPServer.config.get());

loadConfig()可以通过类似的方式设置新配置:

HTTPServer.config.set(new ServerConf(8080, new File("/foo/bar"));

如果同时更改所有配置并不重要,您可以跳过 ServerConf类和使用 AtomicInteger 对于端口设置,AtomicReference<File>为根。

关于java - 将静态字段传递给线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10218296/

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