从线程服务器调用非静态方法

时间:2016-11-05 03:53:39

标签: java multithreading

这有点难以解释,我不得不将代码缩减到我认为重要的部分,因为它太大而无法发布。

我有一个多线程套接字服务器,它向客户端提供一些数据,一切正常,直到它收到两个或多个同时发出的请求,似乎发生的事情是请求返回的数据不正确,实际上包含一个其他请求的数据。

所以我认为这可能是由于我的主要client()方法被定义为静态,因此其中使用的变量由每个请求更新,并且是全局的,而不是仅针对每个单独的请求。

我的main方法必须声明为static,我相信服务器也应该是静态的,因为只有1个实例,但是线程请求也不能是静态的,否则会导致我现在面临的变量损坏。 / p>

问题是我无法编译它,因为client()方法抛出错误'非静态无法从静态上下文调用'。

那么如何从我的服务器线程中调用一个非静态方法,这些方法的变量有自己的范围,这些范围不是静态的,而是对每个请求进行覆盖。

正如我在开始时所说,有点难以解释,我希望我已经覆盖了它?

public static void main(String[] args) throws Exception {
  try {
    new Server().start();
  }
}


public void client(Socket socket, int conidx){
    ... code    
}


private static class Server {

    private void start() {
        ..code  
    } 

    .... code

    try {
      Socket s = serverSocket.accept();
      executorService.submit(new ServiceRequest(s));
    }

    class ServiceRequest implements Runnable {
        ... code

        public void run() {
          client(socket,conidx);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

好吧,你必须先创建主对象的实例(让我们称之为Main,因为你没有包含那段代码)。

其次,Server内部类不能是静态的,因此它存在于封闭类的上下文中:

public static void main(String[] args) throws Exception {
    System.exit(run());
}
...
public int run() throws Exception {
   try {
      new Server().start();
   }
}
...
private class /*no static here*/ Server
{
    class ServiceRequest implements Runnable {
        public void run() {
            client(socket, conidx);
            // or Main.client(socket, conidx);
    ...