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