为什么线程中断有时不起作用?

时间:2017-12-30 21:00:32

标签: java android

public class GameView extends SurfaceView {
    public GameView(Context context) {
        super(context);
        getHolder().addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder surfaceHolder) {
                synchronized (this) {
                    renderThread = new Thread(() -> {
                        while (!Thread.interrupted()) {
                            try {
                                Canvas canvas = surfaceHolder.lockCanvas();
                                canvas.drawARGB(255, 255, 0, 0);
                                surfaceHolder.unlockCanvasAndPost(canvas);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    });
                    renderThread.start();
                }
            }

            @Override
            public void surfaceChanged(SurfaceHolder surfaceHolder, int width, int height, int format) {

            }

            @Override
            public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
                synchronized (this) {
                    renderThread.interrupt();
                    try {
                        renderThread.join();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }

            Thread renderThread;
        });
    }
}

我想在线程中使用SurfaceView绘制一些东西。

我在创建曲面后创建一个新的渲染线程,并在表面被破坏时终止渲染线程。

但有时renderThread在表面被破坏时终止并且线程将进入无限循环。

调用Thread.interrupted()后,

renderThread.interrupt()仍然返回false。

看起来renderThread.interrupt()不起作用。

为什么?

2 个答案:

答案 0 :(得分:0)

当调用中断没有设置中断标志时,你可能碰过这种情况。

  

如果在调用Object类的wait(),wait(long)或wait(long,int)方法,或者join(),join(long),join(long)时阻塞了这个线程,int),sleep(long)或sleep(long,int),这个类的方法,然后它的中断状态将被清除,它将收到InterruptedException。

我建议你检查你的代码(或你所依赖的代码)是否在某个地方捕获InterruptedException以确认或否认我的怀疑。

顺便说一句。还有很多其他的可能性可以清除中断的标志(例如调用#interrupted it self ...)所以我建议你在while check子句中使用其他东西以防止失去对它的控制。

答案 1 :(得分:0)

不要抓住Exception。抓住您期望的异常,并知道如何处理。你可以捕获InterruptedException,在某些情况下可以抛出而不是设置中断标志