2016-11-19 10 views
0

У меня есть класс «HConnection», содержащий несколько методов, таких как abort(); и awaitConnection();Метод Threaded runnable object, не отвечающий на изменения

ОжиданиеConnection(); метод вызывается в моем основном классе SWT Form, используя runnable thread. В любом случае, когда я прерываю() HConnection, соединение await не прерывается, пока оно должно быть.

Посмотрите на этот снимок моего основного кода:

private HConnection connectie; 

private void btnConnect_clicked(SelectionEvent e) { 

    if (btnNewButton_1.getText().equals("Connect")) { 
     String Url = combo.getText(); 
     connectie = new HConnection(Url); 
     connectie.prepare(); 

     new Thread(new Runnable() { 
       public void run() { 
        connectie.awaitConnection(); 

        Display.getDefault().asyncExec(new Runnable() { 
         public void run() { 
          lblNewLabel_2.setText("Waiting -> client"); 
          if (connectie.getState() == 2) { 
           lblNewLabel_2.setText("Replacing URL"); 
          } 
          else { 
           lblNewLabel_2.setText("Failed"); 
           connectie.abort(); 
           btnNewButton_1.setText("Connect"); 
          } 
         } 
        }); 
        if (connectie.getState() == 2) { 
         // go on 

        } 
       } 
     }).start(); 

     //////// 

     btnNewButton_1.setText("Abort"); 
    } 
    else if(btnNewButton_1.getText().equals("Abort")) { 
     connectie.abort(); 
     lblNewLabel_2.setText("Aborted"); 
     btnNewButton_1.setText("Connect"); 
    } 

И снимок HConnection:

public void prepare() { 
    addToHostsFile("127.0.0.1" + "\t" + domain); 
    state = 1; 
} 

public void abort() { 
    removeFromHostsFile("127.0.0.1" + "\t" + domain); 
    waitingConnection = false; 
    HostFileEdited = false; 
    state = 0; 
} 

public void awaitConnection() { 
    if (state == 1) { 
     waitingConnection = true; 
     System.out.println("0"); 
     while (/* not found && */ state == 1) { 

      // code 

     } 
     System.out.println("1"); 
     waitingConnection = false; 
     if (state == 1) state = 2; 
    } 

} 

Один дополнительной записке; функция abort() действительно работала и закончила поток, когда я попытался вызвать connectie.abort() непосредственно после thread.start() ;, (помещенный «////////» в приведенный выше код на этом месте) Но если это называется, где он должен называться, это делать то, что он должен делать в то время как

lblNewLabel_2.setText("Aborted"); 
btnNewButton_1.setText("Connect"); 

делают свою работу, как и ожидалось

+0

Возможно, ваш другой блок внутри метода run() не выполняется. –

+0

@VikasSachdeva no thats not the problem – JonasAnon

+1

Иногда потоки не запускаются сразу, поэтому, когда вы вызываете прерывание после того, как вы вызвали 'start' в своем потоке,' awaitConnection() 'может даже не вызываться –

ответ

1

сделать ваше состояние и awaitConnection летучий:

private volatile int state; 
private volatile boolean awaitConnection; 
+0

Это сделало это! благодаря – JonasAnon

 Смежные вопросы

  • Нет связанных вопросов^_^