簡體   English   中英

如何引用新的Thread類實例?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM