2012-04-18 100 views
2

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

由于性能原因,我不想使用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 
} 

我也不想有工人为嵌套类。它在另一个包...

你有什么建议?

+7

先对它进行正确的编码(即使用getters和所有内容),稍后可能会担心性能。 – biziclop 2012-04-18 21:30:02

+2

这些应该是'HTTPServer'的常规非静态final字段,作为构造函数参数传入。另外,不要过早优化 - 除非另有分析,否则获得者几乎不需要花费任何代价。 – 2012-04-18 21:46:10

+0

在我看来,你问我们如何使它完全混乱的指针。 – 2012-04-18 22:02:18

回答

2

你可以把你的配置放在最后的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>

0

将静态数据读入静态'sharedConfig'对象中,该对象也具有套接字字段 - 您可以将该字段用于侦听套接字。当acccpet()返回一个服务器客户端套接字clone(),'sharedConfig'时,在新套接字中插入并将该对象传递给客户端工作线程服务器。然后线程得到一个配置的副本,它可以消除甚至修改,如果它不想影响任何其他线程或静态配置。