У меня есть класс «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");
делают свою работу, как и ожидалось
Возможно, ваш другой блок внутри метода run() не выполняется. –
@VikasSachdeva no thats not the problem – JonasAnon
Иногда потоки не запускаются сразу, поэтому, когда вы вызываете прерывание после того, как вы вызвали 'start' в своем потоке,' awaitConnection() 'может даже не вызываться –