2012-04-20 45 views
2

我正在編寫一個將模擬Java中的Kerberos協議的代碼。我有一個服務器類和一個客戶端類。但有些內容是靜態的,其他內容不是,加上套接字,我混在一起說至少。我認爲協議的細節在這個問題上是任意的。從子線程訪問父實例

我有一個服務器類,它調用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是給我的服務器類的一部分,我不得不使用它原樣。我自己編寫的someMethod()方法,這是我想從ServerThread中使用的方法。有沒有辦法做到這一點,稱爲this.parent.someMethod()的代碼行?如果可以,是否有辦法從單個控制器類訪問這兩個類,或者靜態內容與非靜態內容是否會破壞該想法?

+0

何時分配了「服務器」實例? – 2012-04-20 15:40:46

+0

對不起,服務器在服務器的主方法中實例化,就在ServerSocket之前。這可以移動。任何此代碼都可以移動。如果需要,主要方法可以在單獨的類中。 – rshaq 2012-04-20 15:43:21

回答

2

當您分配一個Server(大概,只是其中之一),將其寫入靜態字段中Server。然後,您可以從任何地方訪問該字段,包括ServerThread

Server

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

Server.main

server = new Server(); 

ServerThread

Server.server.someMethod(); 
+0

太好了,謝謝!感謝所有嘗試過的人。 – rshaq 2012-04-20 15:48:46

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

你可以傳遞給ServerServerThread的實例的引用(通過吸氣/ setter或修改構造函數)?如果是這樣,通過參考,然後您可以撥打server.someMethod(),假設server是變量名稱。

如果沒有,你會選擇someMethod()有意義的靜態方法?如果將其設置爲靜態方法是安全的,那麼可以這樣做Server.someMethod().

0

當您創建一個套接字上下文類實例以傳遞給您的線程時 - 包含serverSocket等的線程 - 將其加載到服務器實例中'以及。然後您可以從ServerThread輕鬆地調用它的方法。