26
Thread currentThread=Thread.currentThread();
        public void run()
        {               

             while(!shutdown)
            {                               
                try
                {
                    System.out.println(currentThread.isAlive());
                Thread.interrupted();

                System.out.println(currentThread.isAlive());
                if(currentThread.isAlive()==false)
                {
                    shutdown=true;
                }
                }
                catch(Exception e)
                {
                    currentThread.interrupt();
                }                   
            }
        }

    });
    thread.start();
4

3 回答 3

61

调用 stop 的替代方法是使用中断向线程发出信号,表明您希望它完成它正在做的事情。(这假设您要停止的线程表现良好,如果它通过在抛出后立即吃掉它们来忽略 InterruptedExceptions 并且不检查中断状态,那么您将返回使用 stop()。)

这是我写的一些代码作为线程问题的答案它是线程中断如何工作的示例:

public class HelloWorld {

    public static void main(String[] args) throws Exception {
        Thread thread = new Thread(new Runnable() {

            public void run() {
                try {
                    while (!Thread.currentThread().isInterrupted()) {
                        Thread.sleep(5000);
                        System.out.println("Hello World!");
                    }
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
        });
        thread.start();
        System.out.println("press enter to quit");
        System.in.read();
        thread.interrupt();
    }
}

需要注意的一些事项:

  • 中断原因sleep()wait()立即抛出,否则你会卡住等待睡眠时间过去。

  • 请注意,不需要单独的布尔标志。

  • 被停止的线程通过检查中断状态并在while循环之外捕获InterruptedExceptions(使用它退出循环)来进行合作。中断是一个可以使用异常进行流控制的地方,这就是它的全部意义所在。

  • 在 catch 块中的当前线程上设置中断在技术上是最佳实践,但对于这个例子来说是多余的,因为没有其他东西需要设置中断标志。

关于发布的代码的一些观察:

  • 发布的示例不完整,但是将对当前线程的引用放在实例变量中似乎是个坏主意。它将被初始化为创建对象的任何线程,而不是执行 run 方法的线程。如果同一个 Runnable 实例在多个线程上执行,那么实例变量大部分时间都不会反映正确的线程。

  • 检查线程是否处于活动状态总是会导致 true(除非在 currentThread 实例变量引用错误线程时出现错误),Thread#isAlive只有在线程完成执行后才返回 false,它不会返回 false因为它被打断了。

  • 调用Thread#interrupted将导致清除中断标志,在这里没有任何意义,特别是因为返回值被丢弃了。调用Thread#interrupted的目的是测试中断标志的状态,然后将其清除,这是 throw 的事物使用的一种方便方法InterruptedException

于 2011-05-06T18:06:41.560 回答
14

通常,线程在被中断时终止。那么,为什么不使用本机 boolean呢?尝试isInterrupted()

   Thread t = new Thread(new Runnable(){
        @Override
        public void run() {
            while(!Thread.currentThread().isInterrupted()){
                // do stuff         
            }   
        }});
    t.start();

    // Sleep a second, and then interrupt
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {}
    t.interrupt();
于 2011-05-06T18:18:52.360 回答
6

这样做的好方法是使用布尔标志来向线程发出信号。

class MyRunnable implements Runnable {

    public volatile boolean stopThread = false;

    public void run() {
            while(!stopThread) {
                    // Thread code here
            }
    }

}

创建一个名为 myrunnable 的 MyRunnable 实例,将其包装在一个新Thread实例中并启动该实例。当你想标记线程停止时,设置 myrunnable.stopThread = true。这样,它就不会在某事中间停止,只会在我们期望它停止的地方停止。

于 2011-05-06T18:00:55.317 回答