java - 线程化可运行对象方法不响应更改

标签 java multithreading runnable

我有一个类“HConnection”,其中包含多种方法,例如 abort();和awaitConnection();

awaitConnection();方法是在我的 SWT Form 主类中使用可运行线程调用的。无论如何,当我 abort() 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");

正在按预期完成工作

最佳答案

使你的状态和awaitConnection变得不稳定:

private volatile int state;
private volatile boolean awaitConnection;

关于java - 线程化可运行对象方法不响应更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40693504/

相关文章:

java - 如何从 Date 对象中修剪分钟、小时和秒?

java - Java中如何验证某个位置的大数中的整数值是某个值?

c# - AutoResetEvent.WaitOne() 导致死锁

java - 为什么在实现 Runnable 时使用 Thread.currentThread().isInterrupted() 而不是 Thread.interrupted()?

Java 运行程序和接口(interface)

java - Cassandra java驱动程序连接错误

java - WeakHashMap 与并发修改

c# - 使用 SetParent 窃取另一个进程的主窗口但保持消息循环独立

android - Android 中的 Async Task、Runnable 和 Handler 哪个更好

java - 如何从蓝牙设备生成多次主页按钮点击?