2015-04-23 75 views
1

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

有人可以解释我的技术,我们如何受益于这种技术。我不知道如何以及何时离开循环。

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循环或不循环。

编辑

什么时候当另一个的AsyncTask正在呼叫Thread.sleep()方法的Interuption Occur.It装置;它会中断(意味着赶上)。我对吗?我要求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]); 
    } 

回答

1

while (true)声明将永远不会结束,因为没有什么打出来的循环,所以没有,就不能走出while循环。 (取决于// some working here is also running中的内容)

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

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

+0

查看我的编辑请。这意味着AsyncTask的另一个实例调用Thread.sleep();第一个实例调用中断。我是否正确 – Nepster

+0

不。Thread.sleep()唯一能做的就是让线程进入休眠状态。如果另一个线程进入睡眠状态,而第一个线程不会以任何方式影响第一个线程。对于第一个被中断的线程,一些线程需要调用[Thread#interrupt()](http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#interrupt%28% 29)在线程上。 –

+0

那么为什么会发生interuptionException。我想知道它何时会发生,我怎么能控制它。 – Nepster

0

它可以调用任何东西,只要你打破了你的循环,就像这样:

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(); 
} 
+0

我想知道什么时候会得到InterruptedException,以及如何处理多个AsyncTask来完成相同的工作。将CameraPreview YUVbyte设置为位图并连续设置为CameraPreview – Nepster

0

我写了一些代码,这将有助于你理解它是如何工作的。

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(); 
    } 

} 
+0

我想知道什么时候会得到InterruptedException以及如何处理多个AsyncTask来完成相同的工作。将CameraPreview YUVbyte设置为位图并连续设置为CameraPreview - – Nepster

+0

显然您没有运行我的示例。当你想要接收异常的线程上调用interrupt()时,你会得到Exception。如果你有多个AsyncTask,你必须在每个AsyncTask上调用interrupt()。只是遍历它们。 – huidube