thread.interrupt()之后的thread.start()有时工作,其他时候不起作用?

问题描述 投票:1回答:1

为什么当我调用thread.start();在thread.interrupt()之后;它给了我异常线程已经启动。和应用程序停止在Android 4.1.2的三星设备,并没有给我这个例外和应用程序工作正常联想设备与Android 7,而它是相同的代码???它是一个代码,当我启动闪光灯然后停止它并尝试再次启动时使手电筒闪烁...它停在设备上并在另一台设备上运行良好。

`

//thread blinker
    final Thread blinker = new Thread() {

        public void run() {

            while (!this.isInterrupted()) {
                try {
                    if (myCamera == null) {
                        try {

                            myCamera = Camera.open();

                        } catch (RuntimeException e) {

                        }
                    }

                    final Parameters p = myCamera.getParameters();



                    p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
                    myCamera.setParameters(p);
                    myCamera.startPreview();

                    Thread.sleep(150);

                    p.setFlashMode(Parameters.FLASH_MODE_OFF);
                    myCamera.setParameters(p);
                    myCamera.stopPreview();

                    Thread.sleep(150);


                } catch (InterruptedException e) {
                    final Parameters p = myCamera.getParameters();
                    p.setFlashMode(Parameters.FLASH_MODE_OFF);
                    myCamera.setParameters(p);
                    myCamera.stopPreview();
                    Thread.currentThread().interrupt();

                }
            }
        }
    };

//on button
        final Button onButton = findViewById(id.on);
        onButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                blinker.start();

            }
        });

  //off button
        final Button offButton = findViewById(id.off);
        offButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                          blinker.interrupt();

            }
        });

`当我添加blinker.join();用.interrupt();它也给了我同样的例外......我是java的新手,我希望我的问题不会重演

android
1个回答
0
投票

只是因为你打断了一个线程;并不意味着它已经完成。该线程需要一点时间来处理异常,展开堆栈并自行清理。

如果您希望它完成,您应该在尝试重新开始之前加入它。

没有加入,你所拥有的就是竞争条件。一个线程正在发送中断,然后尝试启动;另一个是接收中断然后退出;并且在任何设备上都无法保证首先发生的事情。

© www.soinside.com 2019 - 2024. All rights reserved.