Многопоточность, Интерфейс, расширенный интерфейс, в объектно-ориентированном отслеживании моды с Java не работает.Как я могу решить это? - PullRequest
1 голос
/ 24 апреля 2011

Мой вопрос: почему или как я могу сделать значение «listenerList» равным 1 или 2, чтобы я мог отслеживать и получать статус этого экземпляра из класса оповещения с помощью vector ()?ex: listenerList - мой идентификатор процесса, чтобы отслеживать их, но его всегда значение 0

Вот весь код, не работающий, чтобы увидеть вывод: "это работает !!!, если я могу достичь здесь !!!":

[обновлено после предложения, но все так же, не работает]

1) Интерфейс

public interface Listener
{
    public void registered();
    public void connected(String IP,int Port);
    public void disconnected();
}

2) Расширение интерфейса

public class alert implements Listener
{
  public void  registered() 
  {System.out.println("it WORKS!!!, if i can reach here!!!"); System.exit(0);}
  public void connected(String IP, int Port) 
  { throw new UnsupportedOperationException("Not supported yet.");}
  public void disconnected() 
  {  throw new UnsupportedOperationException("Not supported yet.");   }
}

3) Основной используемый класс

public class Provider extends Thread
{
  public Vector listenerList;
  public alert  alert;   

  public Provider(String userName) throws Exception{ listenerList = new Vector();   
    addListener(alert);
  }
  public void addListener(Listener ls)    {     listenerList.addElement(ls);}  
  public void removeListener(Listener ls) { listenerList.removeElement(ls); }  

  public void run()
  {
    while(running)
    {
      fireRegisteredEvent(); // shows now value of 1, but does not do exit(0);
    }
  }  

  private void fireRegisteredEvent() 
  {
      System.out.println("Fireing Registration: " + System.currentTimeMillis()); 
      System.out.println("Fireing Registration: " + listenerList.size());

      for (int i = 0; i < listenerList.size(); i++) 
      {              
          alert.registered();  
          System.exit(0);                  
      }

  }  
}

4) Действие

private Provider multiinstance;
multiinstance = new Provider("Why are you not triggering: System.exit(0);??????");
multiinstance.start();

5) Вывод

Fireing Registration: 1303646370073
Fireing Registration: 1

....

6) Ожидаемый результат:

a) output: System.out.println("it WORKS!!!, if i can reach here!!!");
OR
b) listenerList.size() value is either 1 or 2?!!
OR
c) alert class and interface should react? no?? if not how i can ??

Ответы [ 3 ]

2 голосов
/ 24 апреля 2011

Потому что вы никогда не создавали экземпляр слушателя и не назначали его одному из провайдеров. Другими словами, вы никогда не звоните addListener(...) и, следовательно, ни один слушатель не может быть запущен.

1 голос
/ 24 апреля 2011

Проблема (помимо прочего) в том, что вы никогда не создавали экземпляр оповещения (тем самым добавляя нулевую ссылку на вектор). Например, вы можете изменить строку

public alert  alert;

до

public alert alert = new alert();

Кроме того, я рекомендую прочитать о соглашениях об именах Java: http://www.oracle.com/technetwork/java/codeconv-138413.html

0 голосов
/ 24 апреля 2011

Почему бы вам не поставить точку останова во время (выполнения), чтобы увидеть, есть ли в списке значения? Похоже, проблема заключается в том, как-то. У вас есть слушатель, добавляющий значения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...