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

时间:2015-08-18 23:05:18

标签: java multithreading thread-safety java-threads interruption

我知道你可以中断从一个runnable类创建的线程,但是如何中断我从一个方法创建的这个线程呢?使用volatile布尔值并不适合我,所以我假设有更好的方法来做到这一点,或者我需要以某种方式中断它。我不想打断所有线程,只是这个。

我创建了一个像这样启动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;
}

2 个答案:

答案 0 :(得分: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,那么它的更新值应该在线程中可见。可能这是一个范围问题,你测试的旗帜与你设置的旗帜不一样?在全球可变状态下,似乎很快就会出现错综复杂的情况。做一个小例子并自己验证设置标志​​或中断线程的工作原理,然后有了这个信心你可以找到真正的问题。

答案 1 :(得分:0)

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

如果

中的代码也无法停止

...

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