【问题标题】:How to use InterruptedException effectively如何有效地使用 InterruptedException
【发布时间】:2015-07-01 14:04:44
【问题描述】:

给定的代码在 doInBackground() 中工作。 while 循环总是正确的,但我不知道它如何在 catch 中调用其他方法。

谁能解释一下这项技术以及我们如何从这项技术中受益。我不知道我们如何以及何时摆脱困境。

doInBackground

    if(isRunning) 
    {
       while (true)  //this loop should run always.
       {
          try 
          {
             Thread.sleep(1L);
          }
          catch (InterruptedException ex) 
          {
            Log.e("Testing Interuption", "error=" + ex.getMessage());
            // some working here is also running 
          }
      } 
  }

它可以在while之后调用任何语句吗?我的意思是它是否也可以退出while循环。

编辑

Interuption 是什么时候发生的。这意味着当另一个 AsyncTask 正在调用 Thread.sleep();它会中断(意味着去赶上)。我说的对吗?

我正在调用Multiple AsyncTasks 来设置CameraPreview using Bitmap

@TargetApi(11)
    public void start()
    {
        if (Build.VERSION.SDK_INT >= 11)
        {
            executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, new Void[0]);
            return;
        }
        execute(new Void[0]);
    }

【问题讨论】:

    标签: java android multithreading exception


    【解决方案1】:

    while (true) 语句永远不会结束,因为没有什么可以跳出循环,所以不,它不能跳出 while 循环。 (不过取决于// some working here is also running 中的内容。)

    如果另一个线程向该线程发送中断,则执行catch 语句中的代码。当代码在catch 下执行后,while 循环会重新开始。

    如果您想在收到InterruptedException 时跳出while 循环,请在catch 内添加break; 语句。

    【讨论】:

    • 请查看我的编辑。这意味着当 AsyncTask 的另一个实例调用 Thread.sleep();一审通话中断。我说的对吗
    • 没有。 Thread.sleep() 唯一要做的就是让线程进入睡眠状态。如果另一个线程在第一个线程睡眠时进入睡眠状态,则不会以任何方式影响第一个线程。对于要中断的第一个线程,某些线程需要在该线程上调用Thread#interrupt()
    • 那么为什么会发生interuptionException。我想知道它什么时候会发生,我该如何控制它。
    • 我认为您需要重申您的原始问题并尝试解释您真正想要完成的事情。对InterruptedException 的关注似乎是错误的前进道路。
    【解决方案2】:

    它可以调用任何东西,只要你跳出你的循环,像这样:

    if (isRunning) {
      while (true) //this loop should run always.
      {
        try {
          Thread.sleep(1L);
        }
        catch (InterruptedException ex) {
          Log.e("Testing Interuption", "error=" + ex.getMessage());
          // some working here is also running 
          break; // <--
        }
      }
    
      doStuffAfterWhileLoop();
    }
    

    【讨论】:

    • 我想知道何时会收到 InterruptedException 以及如何处理多个 AsyncTask 来完成相同的工作。将 CameraPreview YUVbyte 设置为位图并连续设置为 CameraPreview
    【解决方案3】:

    我写了一些代码,应该可以帮助你理解它是如何工作的。

    public class Test2 {
    
        boolean doBreakOut = false;
    
        public Test2() {
            Runnable runnable = new Runnable() {
    
                @Override
                public void run() {
                    while (true) // this loop is running while
                    // !(doBreakOut == true && isInterrupted()).
                    {
                        try {
                            Thread.sleep(1L);
                        } catch (InterruptedException ex) {
                            // this is executed when interrupt() is called.
                            if (doBreakOut) {
                                break;
                            }
                            System.out.println(("Testing Interuption -> "
                                    + "error=" + ex.getMessage()));
                        }
                    }
                    System.out
                            .println("did leave loop, threat will shut down now.");
                }
            };
            try {
                Thread threat = new Thread(runnable);
                threat.start();
                // Thread.sleep(x) makes the main thread wait for x milliseconds
                Thread.sleep(2000);
    
                threat.interrupt();
    
                Thread.sleep(2000);
    
                threat.interrupt();
    
                Thread.sleep(2000);
                doBreakOut = true;
                threat.interrupt();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        public static void main(String[] args) {
    
            new Test2();
        }
    
    }
    

    【讨论】:

    • 我想知道何时会收到 InterruptedException 以及如何处理多个 AsyncTask 来完成相同的工作。将 CameraPreview YUVbyte 设置为位图并连续设置为 CameraPreview –
    • 显然你没有运行我的例子。当您在要接收异常的线程上调用 interrupt() 时,您会得到异常。如果您有多个 AsyncTask ,则必须在每个线程上调用 interrupt() 。只需遍历它们。
    猜你喜欢
    • 2023-04-03
    • 2012-05-25
    • 1970-01-01
    • 2011-07-09
    • 2012-03-16
    • 1970-01-01
    • 2011-10-09
    • 2013-02-12
    • 2017-02-15
    相关资源
    最近更新 更多