繁体   English   中英

如何中断从方法内部创建的线程?

[英]How can I interrupt a thread created from within a method?

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

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

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

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

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,则其更新值应该在线程之间可见。 如果您正在测试的标志与您设置的标志不同,这可能是一个范围界定问题吗? 随着全球可变状态的出现,它似乎很快就会令人费解。 举一个小例子,并亲自验证设置标志​​或中断线程是否有效,然后您可以自信地找到真正的问题。

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

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

...

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM