Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “的范围是什么?”;这";从单个线程调用方法时?_Java_Multithreading - Fatal编程技术网

Java “的范围是什么?”;这";从单个线程调用方法时?

Java “的范围是什么?”;这";从单个线程调用方法时?,java,multithreading,Java,Multithreading,我正在编写一个小Java类来充当项目的心跳。这门课相当简单。我有一个名为HeartbeatServer.class的公共类,它包含两个实现Runnable的私有类 heartbeat和listener线程都将使用相同的DatagramSocket,我在两个线程类的作用域之外创建了它,并声明它是volatile的,因此两个线程都可以访问它 我的问题是关于我的线程类。在线程类中,如果我调用HeartbeatServer.this.serverSocketthis的作用域是什么?我担心的是,我不希望每

我正在编写一个小Java类来充当项目的心跳。这门课相当简单。我有一个名为
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();
     }
  }

}