2015-04-23 78 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