2014-10-04 36 views
0

我想開始說如果你知道更好的方法來做到這一點,請告訴我。我寧願知道一個更好的做法,而不是做得不對。如何引用Thread類的新實例?

我在寫一個服務器程序,它必須與多個客戶端交互。我正在使用這個答案提出的方法。 (socket programming multiple client to one server)。我正在創建'EchoThread'的新實例。

我也有另一個類,有一些變量,需要能夠被我的服務器中的所有類/操作訪問和更改。我想知道如何從創建新的'EchoThread'對象和'EchoThread'類的類中注入(我認爲就是它所稱的)實例。從上面的鏈接的答案

部分:

while (true) { 
     try { 
      socket = serverSocket.accept(); 
     } catch (IOException e) { 
      System.out.println("I/O error: " + e); 
     } 
     // new threa for a client 
     new EchoThread(socket).start(); 
    } 

我有類的實例我要注入:

VarsClass vars = new VarsClass(); 

我通常「鏈接」,這些做的事:

VarsClass vars = new VarsClass(); 
ExampleClass example = new ExampleClass(); 
example.link(vars); 

這是'ExampleClass'中的'link'方法

public void setGlobalVariables(GlobalVariables global) { 

    this.globalVariables = global; 

} 

我如何在'ExmapleClass'和'VarsClass'中引用'EchoThread'?我正在這樣做,所以每個類都不創建VarsClass的新實例。 (避免我在這裏的問題:Using the same variables in two threads, but I don't know why they won't update in Java

非常感謝您提前給予每一位的耐心和幫助。 〜Rane

+0

你可以在這裏注入:'new EchoThread(socket).start();'。給EchoThread的構造函數另一個參數或更多。 – 2014-10-04 00:51:38

+0

不要這樣寫代碼。啓動線程的行應該在try塊內:否則,如果有異常,您將使用上次接受的套接字啓動另一個線程。取決於try塊中代碼成功的代碼也應該放在try塊中。 – EJP 2014-10-04 02:17:03

回答

0

您可以像使用任何其他類的實例一樣執行此操作。

EchoThread thread = new EchoThread(socket); 
thread.setGlobalVariables(globalVars); 
thread.start(); 
1

如何引用EchoThread ...

簡單的方法是這樣的:

EchoThread et = new EchoThread(socket); 
et.link(vars); 
et.start(); 

或者通過vars對象作爲另一個參數構造函數。


請注意,以下變體是錯誤的...除非您使EchoThread線程安全。

EchoThread et = new EchoThread(socket); 
et.start(); 
... 
et.link(vars); 

(它是安全的說法之前傳遞給start()呼叫,因爲有一個明確的「之前發生」關於start()電話...調用start()線程和新線程的起點之間run()方法。)


另外要注意的是,Thread中編寫子類通常被認爲是實現多線程的一個好辦法。更好的方法是將您的線程邏輯實現爲Runnable;例如

public class MyRunnable implements Runnable { 
    // thread state variables here ... 
    public MyRunnable(Socket sock, GlobalVariables vars) { 
     ... 
    } 

    public void run() { 
     // thread logic goes here ... 
    } 
} 

,並使用它像這樣:

new Thread(new MyRunnable(sock, vars)).start(); 

這種方法可以讓你輕鬆改變你的代碼,使用一個線程池或遺囑執行人,而不是你動態創建一個線程。 (在線創建線程往往很昂貴。)

相關問題