Создать класс timeOut в Java - PullRequest
0 голосов
/ 24 января 2012

Я хотел бы создать класс (поток) Java, который пингует твиттер, и, если нет соединения, дождитесь соединения и перезапустите некоторые другие классы и потоки. У меня есть код, который «пингует» сайты, и способ запуска каждого статического метода есть в моем классе Main. Это хорошее решение проблемы?

Вот основная часть кода:

while (true){
 try {
final URLConnection connection = new URL(url).openConnection();
connection.connect();
}
catch (Exception e) {
   Thread.sleep(10000*t);
 if    (url.matches(twitter1)){
        Thread method1= new Thread(Class1.method1);
        method1.start();
 }else if (url.matches(twitter2)){
        Thread method2 = new Thread(Class1.method2);
        method2.start();
}else if (url.matches(twitter3)){
        Main.StaticMethod();
}else if (url.matches(twitter4)){
        Main.StaticMethod2();
}else if (url.matches(twitter5)){
        Main.StaticMethod3();
}else{
        System.out.println("Unknown URL");
}
t=2^t;
}
}

Ответы [ 3 ]

1 голос
/ 24 января 2012

Вы не запускаете классов или потоков , вы можете только вызывать методы .Если методы instance methods, тогда вам нужно object;в противном случае они равны static, и вам необходимо знать class, в котором они определены.Если вы хотите запустить еще один thread, то вам нужен object из class, который implements Runnable.

Например,

try {
  final URLConnection connection = new URL(url).openConnection();
  connection.connect();
  } catch (Exception e) {
  }
  // connection is available, either use it or close it. then,

  // AfterConnect is a class that implements Runnable. Perhaps it takes 
  // the connection as parameter? 
  AfterConnect afterConnect = new AfterConnect(..);

 // this will start a new thread 
  new Thread(afterConnect).start();

Кстати, ваш пример не «ждет, пока будет установлено соединение».Если вы собираетесь поместить try...catch в цикл, вы должны sleep в течение некоторого времени между итерациями.

0 голосов
/ 24 января 2012

Я не совсем уверен, как вы структурировали материал "перезапустите некоторые другие классы и потоки". Если это путаница вызовов методов, вы можете поместить представленный вами код в абстрактный класс и добавить абстрактный метод

abstract class AbstractTimeout {
   ...  your code here, but add a call to afterConnection() ...

   protected abstract void afterConnection();
}

Подкласс будет реализовывать это, устанавливая некоторые поля для всех объектов классов и вызовов в конструкторе, а затем реализуя путаницу вызовов в

protected void afterConnection() {
   class1.goDoThis();
   object2.goDoThat();
   someRunnable.run();
   // ... etc... 
}

Это классика inheritance. Кстати, вы должны рассмотреть, какие исключения могут быть выброшены, а какие объявить. Для простоты я проигнорировал эту проблему.

В качестве альтернативы, если материал «перезапустить некоторые другие классы и потоки» уже находится в чем-то довольно простом и хорошо организованном, например, Runnable, вы можете сделать так, чтобы ваш класс принял Runnable вместе с URLConnection как аргумент и запустите () Runnable (или запустите его в новом потоке) после завершения соединения. Это классическая композиция . например,

public void doTimeout(URL url, Runnable afterConnection) {
      // your connection stuff from above

      afterConnection.run();
   }

ПРИМЕЧАНИЕ: я не помещал afterConnection.run () в поток, потому что я думаю, что doTimeout уже должен быть в его собственном потоке. YMMV.

ПРИМЕЧАНИЕ 2. Мое второе решение аналогично концепции @Miserable Variable afterConnect (). Я использовал Runnable, он использовал более гибкий интерфейс.

0 голосов
/ 24 января 2012

Как вы определите «запуск» классов? Один из способов сделать это - хранить ссылки на эти классы в своем классе timeOut, а затем вызывать методы, которые вы хотите использовать при успешной проверке сайта.

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