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

时间:2018-03-02 14:39:18

标签: android

为什么当我调用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的新手,我希望我的问题不会重复

1 个答案:

答案 0 :(得分:0)

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

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

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