Я пишу небольшой класс Java, чтобы ускорить работу над проектом. Класс довольно простой. У меня есть открытый класс под названием HeartbeatServer.class, который содержит частные классы, которые реализуют Runnable.

И поток пульса, и поток слушателя будут использовать один и тот же DatagramSocket, который я создал за пределами обоих классов потоков и объявил его изменчивым, чтобы оба потока могли получить к нему доступ.

Мой вопрос касается моих классов потоков. В классах потоков, если я вызываю HeartbeatServer.this.serverSocket, какова область действия this? Меня беспокоит то, что я не хочу, чтобы каждый поток использовал другую версию HeartbeatServer, поскольку мне нужно привязать DatagramSocket к определенному IP-адресу и порту.

Правильно ли то, что я делаю, чтобы получить желаемый результат? Я хочу, чтобы оба потока имели доступ к одному и тому же DatagramSocket, который был создан конструктором класса HeartbeatServer.

Вот мой код.

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

        }

    }

}

** НОТА **

Мой код не готов, поэтому в текущем контексте все может не иметь никакого смысла.

3
ianc1215 22 Окт 2015 в 11:21

2 ответа

Лучший ответ

Если вам нужно, чтобы 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;        
    }
}

Что вы делаете, ваш объект потока использует родительский объект. Что не рекомендуется.

0
Viswanath Lekshmanan 22 Окт 2015 в 08:29

Если вы хотите убедиться, что полученный экземпляр HeartBeatServer является правильным, вы можете добавить конструктор во внутренние исполняемые файлы в соответствии со строками

private class HeartbeatThread implements Runnable {

  private HeartbeatServer server;

  HeartBeatThread(HeartbeatServer theServer) {
    this.server = theServer;
  }

  @Override
  public void run() {
     while (server.running) {
       server.sendData();
     }
  }

}
0
francesco foresti 22 Окт 2015 в 08:33