为什么当我调用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的新手,我希望我的问题不会重复
答案 0 :(得分:0)
只是因为你打断了一个线程;并不意味着它已经完成。该线程需要一点时间来处理异常,展开堆栈并自行清理。
如果您希望它完成,您应该在尝试重新开始之前加入它。
没有加入,你所拥有的就是竞争条件。一个线程正在发送中断,然后尝试启动;另一个是接收中断然后退出;在任何设备上都无法保证首先发生的事情。