【问题标题】:Unable to kill a Thread in Android无法在 Android 中杀死线程
【发布时间】:2014-05-02 05:18:34
【问题描述】:

我在一个类中创建了一个线程,代码如下

private void startThread() {
    if (t != null) {
        t.interrupt();
    }
    isFlashOn = true;

    t = new Thread() {
        public void run() {
            try {
                try {
                    SurfaceView surfaceView = (SurfaceView) activity
                            .findViewById(R.id.surfaceViewCam);
                    SurfaceHolder surfaceHolder = surfaceView.getHolder();
                    // surfaceHolder.addCallback(this);
                    camera.setPreviewDisplay(surfaceHolder);
                } catch (Exception e) {
                    e.printStackTrace();
                }

                camera.startPreview();

                for (int i = seekBarManager.preferenceManager
                        .get_duration(); i > 0 && !this.isInterrupted(); i--) {
                    isFlashOn = true;
                    setBlinkToggle();
                    sleep(seekBarManager.preferenceManager.get_delay());
                    if(isFlashOn==false){
                        break;
                    }
                }

                if (camera != null) {
                    camera.stopPreview();
                    camera.release();
                    camera = null;
                }

            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    };

    t.start();
}

我在一个方法中停止线程

private void stopThread() {
    if (t != null) {
        t.interrupt();
        //t.
        isFlashOn = false;
    }
}

我面临的问题是,即使Interrupt()成功调用,线程中的for循环似乎也在运行

这里的任何帮助将不胜感激!

更新代码

t = new Thread() {
            public void run() {
                Boolean isStop = false;
                try {
                    try {
                        SurfaceView surfaceView = (SurfaceView) activity
                                .findViewById(R.id.surfaceViewCam);
                        SurfaceHolder surfaceHolder = surfaceView.getHolder();
                        // surfaceHolder.addCallback(this);
                        camera.setPreviewDisplay(surfaceHolder);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    camera.startPreview();

                    for (int i = seekBarManager.preferenceManager
                            .get_duration(); i > 0 && !isStop; i--) {
                        isFlashOn = true;
                        setBlinkToggle();
                        sleep(seekBarManager.preferenceManager.get_delay());
                    }

                    if (camera != null) {
                        camera.stopPreview();
                        camera.release();
                        camera = null;
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                    isStop=true;
                    //notify();
                    return;
                }

            }
        };

【问题讨论】:

    标签: android multithreading


    【解决方案1】:

    interrupt() 的目的: 它只是将中断标志设置为真。在调用了 interrupt() 之后,Thread.currentThread().isInterrupted() 开始返回 false。仅此而已。

    另一种情况是,如果在调用引发 InterruptedException 的方法之一阻塞线程时调用了 interrupt(),则该方法将返回并抛出 InterruptedException。如果线程的代码只是“吃掉”了那个异常,那么线程仍然会继续运行。

    所以正确的做法应该是定期检查中断标志。如果检测到中断状态,则尽快返回。另一个常见的选择是根本不使用 Thread.interrupt(),而是使用一些自定义布尔值。

    请参阅以下链接以安全停止线程:-

    http://www.java2s.com/Code/Java/Threads/Thesafewaytostopathread.htm

    【讨论】:

    • 亲爱的 Bette Devine,我已经完成了所需的更改。但是线程仍然继续运行。我需要在 catch 块中委托 Interrupted 异常吗?
    • 你能在for循环中添加一个条件来检查线程是否被中断然后中断循环吗?
    • 我确实尝试过。我现在面临的问题是,在调试模式下,一切正常。但是当我运行线程时,它失败了。
    • 请参考我上面的问题(代码已更新)
    • 看看这个帖子,如果它可以帮助你 - 我通过这篇帖子解决了我的问题:stackoverflow.com/a/13552114/2035885
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    相关资源
    最近更新 更多