gpt4 book ai didi

java - 如何引用 Thread 类的新实例?

转载 作者:行者123 更新时间:2023-12-01 12:27:52 24 4
gpt4 key购买 nike

首先我想说的是,如果您知道更好的方法,请告诉我。我宁愿知道更好的方法,也不愿做错误的事情。

我正在编写一个必须与多个客户端交互的服务器程序。我正在使用这个答案提出的方法。 (socket programming multiple client to one server)。我正在创建“EchoThread”的新实例。

我还有另一个类,它有许多变量,需要能够被我的服务器中的所有类/操作访问和更改。我想知道如何从创建新的“EchoThread”对象和“EchoThread”类的类中注入(inject)(我认为这就是它的名称)实例。

上面链接的部分答案:

 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();
}

我有要注入(inject)的类的实例:

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)

提前感谢大家的耐心和帮助。 〜雷恩

最佳答案

How do I reference the 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();

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

关于java - 如何引用 Thread 类的新实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26188562/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com