0

我知道您可以中断从可运行类创建的线程,但是如何中断从方法创建的线程?使用 volatile 布尔值对我不起作用,所以我认为要么有更好的方法来做到这一点,要么我需要以某种方式中断它。我不想中断所有线程,只是这个。

我创建了一个启动线程的方法,如下所示:

public static void StartSyncThread() {
        new Thread() {
            public void run() {
                    isRunning = true;  // Set to true so while loop will start

                    while (isRunning) {
                        ...
                        }

            } // Close run()
        }.start();

    }

……

public static void KillSyncThread() {
    isRunning = false;
}
4

2 回答 2

1

如果您保留对线程的引用:

private static Thread myThread;

public static void StartSyncThread() {
    myThread = new Thread() {
        public void run() {    
            while (!Thread.currentThread().isInterrupted()) {
                        ...
            }

        } // Close run()
    }
    myThread.start();
}

然后你可以打电话

public static void killSyncThread() {
    if (myThread != null && myThread.isAlive()) {
        myThread.interrupt();
    }
}

取消它。这样您就可以摆脱静态 isRunning 标志,interrupt() 设置一个与之等效的内置标志,另外它会将线程从睡眠或等待中唤醒。

如果您确实将变量声明为 volatile,那么它的更新值应该在线程中可见。可能这是一个范围界定问题,您正在测试的标志与您设置的标志不同?对于全局可变状态,它似乎可能会很快变得复杂。做一个小例子,自己验证设置标志​​或中断线程是否有效,然后有信心找到真正的问题。

于 2015-08-19T02:21:58.973 回答
0

在您调用 KillSyncThread 之前,您的代码可能不会真正启动线程。如果是这种情况,那么线程会将 isRunning 设置为 true,然后继续永远运行。在您启动线程之前,我会将 isRunning 设置为 true。

如果代码中的代码也将无法停止

...

具有无限内循环或对阻塞函数(如套接字读取)的调用。

于 2015-08-19T01:12:44.213 回答