我怎样才能杀死一个线程? 不使用stop();

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();

调用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是测试中断标志的状态,然后清除它,这是抛出InterruptedException的东西所使用的便捷方法。


  • 通常,线程在中断时被终止。 那么,为什么不使用本地布尔值呢? 尝试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();
    

    好的方法是使用布尔标志来表示线程。

    class MyRunnable implements Runnable {
    
        public volatile boolean stopThread = false;
    
        public void run() {
                while(!stopThread) {
                        // Thread code here
                }
        }
    
    }
    

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

    链接地址: http://www.djcxy.com/p/92123.html

    上一篇: How can I kill a thread? without using stop();

    下一篇: Why does Thread Class implements Runnable Interface