2016-11-19 50 views
0

我有一个包含多种方法(如abort())的类“HConnection”。和awaitConnection();线程可运行对象方法对变化没有响应

awaitConnection();方法在我的SWT Form主类中使用可运行线程调用。无论如何,当我放弃()HConnection,awaitConnection不会中止,而应该是。

看一看这个快照我的主要代码:

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; 
    } 

} 

还要说明;当我尝试在thread.start()之后直接调用connectie.abort()时,abort()函数确实可以正常工作并完成了线程,;(在上面的代码中放置了“////////” ) 但如果这就是所谓的,它应该被调用,它做它应该做的 而

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

正在做他们的工作预期

+0

也许你的else块内run()方法没有得到执行 –

+0

@VikasSachdeva没有多数民众赞成没有问题 – JonasAnon

+1

有时线程不会立即开始,所以当你在你的线程调用'start'之后调用中止,'awaitConnection()'甚至可能不会被调用 –

回答

1

让你的状态和awaitConnection挥发性:

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

这样做了!谢谢 – JonasAnon