Java “的范围是什么?”;这";从单个线程调用方法时?
我正在编写一个小Java类来充当项目的心跳。这门课相当简单。我有一个名为Java “的范围是什么?”;这";从单个线程调用方法时?,java,multithreading,Java,Multithreading,我正在编写一个小Java类来充当项目的心跳。这门课相当简单。我有一个名为HeartbeatServer.class的公共类,它包含两个实现Runnable的私有类 heartbeat和listener线程都将使用相同的DatagramSocket,我在两个线程类的作用域之外创建了它,并声明它是volatile的,因此两个线程都可以访问它 我的问题是关于我的线程类。在线程类中,如果我调用HeartbeatServer.this.serverSocketthis的作用域是什么?我担心的是,我不希望每
HeartbeatServer.class
的公共类,它包含两个实现Runnable
的私有类
heartbeat和listener线程都将使用相同的DatagramSocket
,我在两个线程类的作用域之外创建了它,并声明它是volatile的,因此两个线程都可以访问它
我的问题是关于我的线程类。在线程类中,如果我调用HeartbeatServer.this.serverSocket
this的作用域是什么?我担心的是,我不希望每个线程都使用不同版本的HeartbeatServer
,因为我必须将DatagramSocket
绑定到特定的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);
}
**注**
我的代码没有完成,因此在当前上下文中可能没有任何意义。如果您需要
HeartbeatServer
成为唯一的,您应该创建HeartbeatServer
Singleton。请查看更多详细信息
简单地
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;
}
}
您要做的是,线程对象正在使用封闭的父对象。这是不推荐的。如果您想确保获得的
HeartBeatServer
实例是正确的,您可以向内部可运行程序添加构造函数,如下所示:
private class HeartbeatThread implements Runnable {
private HeartbeatServer server;
HeartBeatThread(HeartbeatServer theServer) {
this.server = theServer;
}
@Override
public void run() {
while (server.running) {
server.sendData();
}
}
}
HeartbeatServer。这仅适用于附带的HeartbeatServer类。如果我通过创建的singleton访问所有方法,是否需要将套接字和运行变量声明为volatile?如果您经常将多个线程的值写入singleton中的变量,请执行该操作。如果是只读的,就不需要了。
private class HeartbeatThread implements Runnable {
private HeartbeatServer server;
HeartBeatThread(HeartbeatServer theServer) {
this.server = theServer;
}
@Override
public void run() {
while (server.running) {
server.sendData();
}
}
}