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

标签 java multithreading static final

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

然后你的worker可以通过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/

相关文章:

java - 使用 H2 数据库了解 JdbcConnectionPool

c++ - C/C++ - 运行系统 ("process &"),然后写入其标准输入

c - 静态的生命周期真的在程序执行时开始吗?

java - 将二维 ArrayList 转换为二维数组

java - 如何将字符串中的字符转换为数字(转换为电话号码)?

multithreading - 基于网络的消息传递程序的同时输入和输出

java - 在 Java 中通过线程控制方法的执行

java - 语法 - Java 类的静态段

xcode - 如何仅在链接时有条件地使用静态库

java - 为什么 JpaRepository 在保存实体时尝试为空 FK 键创建实体?