Java 如何引用线程类的新实例?

Java 如何引用线程类的新实例?,java,multithreading,java-server,Java,Multithreading,Java Server,首先,我想说,如果你知道更好的方法,请告诉我。我宁愿知道一个更好的方法来做这件事,也不要做得不对 我正在编写一个必须与多个客户端交互的服务器程序。我正在使用这个答案提出的方法。(). 我正在创建“EchoThread”的新实例 我还有另一个类,它有许多变量,需要能够被服务器中的所有类/操作访问和更改。我想知道如何从创建新的“EchoThread”对象和“EchoThread”类的类中注入(我想这就是它的名称)该类的实例 以上链接的部分答案: while (true) { try

首先,我想说,如果你知道更好的方法,请告诉我。我宁愿知道一个更好的方法来做这件事,也不要做得不对

我正在编写一个必须与多个客户端交互的服务器程序。我正在使用这个答案提出的方法。(). 我正在创建“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实例。(避免我在这里遇到的问题:)

提前感谢大家的耐心和帮助。
~Rane

您可以使用与任何其他类的实例相同的方法来执行此操作

EchoThread thread = new EchoThread(socket);
thread.setGlobalVariables(globalVars);
thread.start();
如何引用
EchoThread

简单的方法如下:

EchoThread et = new EchoThread(socket);
et.link(vars);
et.start();
new Thread(new MyRunnable(sock, vars)).start();
或者将
vars
对象作为另一个参数传递给构造函数


请注意,以下变体是错误的。。。除非您使
EchoThread
线程安全

EchoThread et = new EchoThread(socket);
et.start();
...
et.link(vars);
(在调用
start()
之前传递参数是安全的,因为在调用
start()
的线程和新线程的
run()
方法的启动之间,
start()
调用上有一个显式的“before”


需要注意的另一点是,编写
Thread
的子类通常被认为是实现多线程的糟糕方法。更好的方法是将线程的逻辑实现为可运行的
Runnable
;e、 g

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

    public void run() {
         // thread logic goes here ...
    }
}
用户可以这样使用它:

EchoThread et = new EchoThread(socket);
et.link(vars);
et.start();
new Thread(new MyRunnable(sock, vars)).start();

这种方法允许您轻松地将代码更改为使用线程池或执行器,而不是动态创建的线程。(动态创建线程往往代价高昂。)

您可以在此处注入:
新的EchoThread(socket).start()。为EchoThread的构造函数提供另一个或多个参数。不要这样编写代码。启动线程的行应该在try块内:否则,如果出现异常,您将使用最后接受的套接字启动另一个线程。依赖于try块中代码成功与否的代码也应该在try块中。