从子线程访问父实例

时间:2012-04-20 15:32:32

标签: java multithreading sockets static parent

我正在编写一个代码,用于模拟Java中的Kerberos协议。我有一个服务器类和一个客户端类。但有些内容是静态的,而其他内容则不是,加上套接字,我至少可以说。我认为协议的细节在这个问题上是任意的。

我有一个Server类,它调用ServerThread类:

public class Server{

    public void someMethod(){ /* some code */ }

    public static void main(String args[]){ 
        ServerSocket serverSocket = new ServerSocket(port);
        new ServerThread(serverSocket.accept()).start();
    }
}

public class ServerThread extends Thread{
    /* constructor (takes serverSocket from Server) */

    this.parent.someMethod();
    /* That would call someMethod() from the parent class Server instance
     * that instantiated this.
     */
    }

实例化ServerThread的Server类部分是给我的,我必须按原样使用它。我自己编写的someMethod()方法,就是我想从ServerThread中使用的方法。有没有办法做这个调用代码行说明this.parent.someMethod();?如果可以,有没有办法从单个控制器类访问这两个类,或者静态内容与非静态内容是否会破坏这个想法?

4 个答案:

答案 0 :(得分:3)

您是否可以将对Server的实例的引用传递给ServerThread(通过getter / setters或修改构造函数)?如果是,请传递引用,然后您可以调用server.someMethod(),假设server是变量名称。

如果没有,您的someMethod()作为静态方法会有意义吗?如果使其成为静态方法是安全的,您可以执行Server.someMethod().

答案 1 :(得分:2)

当您分配Server(可能只有其中一个)时,请将其写入Server中的静态字段。然后,您可以从任何位置访问该字段,包括ServerThread

Server

static Server server; // the one true server in this application

Server.main

server = new Server();

ServerThread

Server.server.someMethod();

答案 2 :(得分:0)

  class Server extends Thread{

    public void someMethod(){ /* some code */ }

    public static void main(String args[]){ 
      //  ServerSocket serverSocket = new ServerSocket(port);

    }
}

  class ServerThread extends Server{
    /* constructor (takes serverSocket from Server) */
public ServerThread(){
     super.someMethod();

}

答案 3 :(得分:0)

当你创建一个套接字上下文类实例传递给你的线程 - 包含serverSocket等的那个 - 用服务器实例'this'加载它。然后,您可以从ServerThread轻松调用其中的方法。