[英]How do I refrence new Instances of Thread classes?
首先,我想說的是,如果您知道一種更好的方法,請告訴我。 我寧願知道一種比錯誤地執行此操作更好的方法。
我正在編寫一個必須與多個客戶端交互的服務器程序。 我正在使用此答案提出的方法。 (將多個客戶端編程到一台服務器 )。 我正在創建“ 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的新實例。 (避免了我在這里遇到的問題: 在兩個線程中使用相同的變量,但是我不知道為什么它們不會在Java中更新 )
預先感謝大家的耐心和幫助。 〜萊恩
我如何引用
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();
這種方法使您可以輕松地將代碼更改為使用線程池或執行程序,而不是動態創建的線程。 (動態創建線程往往很昂貴。)
您可以像處理任何其他類的實例一樣進行操作。
EchoThread thread = new EchoThread(socket);
thread.setGlobalVariables(globalVars);
thread.start();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.