Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程中断替代方案?_Java_Android_Multithreading - Fatal编程技术网

Java 线程中断替代方案?

Java 线程中断替代方案?,java,android,multithreading,Java,Android,Multithreading,使用SOS模式构建手电筒应用程序。有3个按钮(On、Off和SOS)。应用程序在正常打开和关闭模式下工作,但不在SOS模式下工作。(SOS模式不关闭) 这里使用的是Flashthread void onSOSPress() { if (number_of_press == 1) { try { SOSon = true; if (!Flashthread.isInterrupted()) {

使用SOS模式构建手电筒应用程序。有3个按钮(On、Off和SOS)。应用程序在正常打开和关闭模式下工作,但不在SOS模式下工作。(SOS模式不关闭)

这里使用的是
Flashthread

void onSOSPress() {
        if (number_of_press == 1) {
            try {
                SOSon = true;
                if (!Flashthread.isInterrupted()) {
                    if (SOSon) {
                        Flashthread = new Thread(new Runnable() {
                            @Override
                            public void run() {
                                for (int i = 0; i < System.currentTimeMillis(); i++) {
                                    if (FlashOn) {
                                        myParameters.setFlashMode(Parameters.FLASH_MODE_OFF);
                                        myCamera.setParameters(myParameters);
                                        FlashOn = false;
                                    } else {
                                        TurnOnFlash();
                                    }
                                    try {
                                        Thread.sleep(1000);
                                    } catch (InterruptedException e) {
                                        e.printStackTrace();
                                    }

                                }
                            }
                        });
                        Flashthread.start();
                    }
                } else
                    Flashthread.resume();
            } catch (Exception ex) {
                throw ex;
            }
        }
    }
void onsopress(){
如果(按的次数=1){
试一试{
SOSon=真;
如果(!Flashthread.isInterrupted()){
如果(索森){
Flashthread=新线程(新可运行(){
@凌驾
公开募捐{
对于(int i=0;i
turnOffFlash
方法中,由于我读到中断方法并没有真正“中断”/杀死线程,我可以用什么来代替
thread.Interrupt()
以便按下
Off
按钮停止
SOS
模式?
我尝试了
stop()
destroy()
,但两者都使应用程序崩溃。

您应该使用的是注释中建议的
处理程序
,但是如果您想坚持使用此系统,请使用一个标志告诉您的线程停止:

boolean shouldStop = false;

...
while (!shouldStop){
  if(FlashOn){
    ...//do SOS stuff
  }
}

...
public void endSOS(){
  shouldStop = true;
}

如果要强制抛出异常,您需要使用
线程#中断()

boolean isClose = false;

while(!isClose){
  try {
      // Your code here
  } catch (InterruptedException e) {
     if(isClose){
        break;
     }
  }
}

public void killThread(){
  isClose = true;
  interrupt();
}
来实现代码

 MyCustomThread t = new MyCustomThread(....);

 // Assuming that the thread is already running
 t.killThread();

这种方法经常在流行的库中使用,如
Volley
等。

为什么要使用这样一个复杂的启动和终止线程的系统?使用
处理程序
有什么问题?将使用“处理程序”尝试SOS模式。但一般来说,在中断不能真正完成预期任务的情况下,我需要做什么?如果可能的话,请发送一个使用“处理程序”实现的代码示例?非常感谢。阿努拉,你能给我看看你的闪光线吗?只是第二个问题。这段代码是否只运行一次SOS模式,因为任何停止的线程都无法重新启动?是的,尽管您可以修改它以允许重新启动。然而,我要做的只是实例化这个类的一个新实例并启动它。有意义吗?是的,我这样做了,但在这一步“myCamera.setParameters(myParameters);”时崩溃了抱歉给你添麻烦了,哈哈,我找了点零钱就修好了。非常感谢!
 MyCustomThread t = new MyCustomThread(....);

 // Assuming that the thread is already running
 t.killThread();