gpt4 book ai didi

java - 从单个线程调用方法时, "this"的范围是什么?

转载 作者:行者123 更新时间:2023-12-02 06:16:03 30 4
gpt4 key购买 nike

我正在编写一个小型 Java 类来充当项目的心跳。类(class)相当简单。我有一个名为 HeartbeatServer.class 的公共(public)类,其中包含都实现 Runnable 的私有(private)类。

心跳和监听器线程都将使用我在两个线程类范围之外创建的相同的 DatagramSocket 并将其声明为 volatile ,以便两个线程都可以访问它。

我的问题是关于我的线程类。在线程类中,如果我调用 HeartbeatServer.this.serverSocketthis 的范围是什么?我担心的是,我不希望每个线程使用不同版本的 HeartbeatServer,因为我必须将 DatagramSocket 绑定(bind)到特定的 IP 地址和端口。

我正在做的事情是否正确以获得我想要的结果?我希望两个线程都可以访问由 HeartbeatServer 类的构造函数创建的同一个 DatagramSocket

这是我的代码。

public volatile DatagramSocket serverSocket;
private Map<String, InetSocketAddress> registeredClients = new HashMap<String, InetSocketAddress>();
public volatile Boolean running = true;

public HeartbeatServer() throws SocketException{

serverSocket = new DatagramSocket(null);

}

** 其他方法将在此处 **

// This is the thread that will send the heartbeats back to the client.
private class HeartbeatThread implements Runnable {

@Override
public void run() {

while (HeartbeatServer.this.running) {

HeartbeatServer.this.sendData();

}

}

}

// This is the thread that will listen for clients connecting to the server.
private class ListenerThread implements Runnable {

@Override
public void run() {

while (HeartbeatServer.this.running) {

HeartbeatServer.this.recieveData();

}

}

}

** 注意 **

我的代码尚未完成,因此在当前上下文中事情可能没有任何意义。

最佳答案

如果您需要 HeartbeatServer 是唯一的,您应该将 HeartbeatServer 设置为 Singleton。请查看here了解更多详情。

简单

public class HeartbeatServer {
private static HeartbeatServer heartbeatServer;

// Disable object creation from other classes
private HeartbeatServer () {
}

public static HeartbeatServer getInstance() {
if(heartbeatServer == null)
heartbeatServer = new HeartbeatServer();
return heartbeatServer;
}
}

您正在做的是,您的线程对象正在使用封闭的父级。不推荐这样做。

关于java - 从单个线程调用方法时, "this"的范围是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33276394/

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