如何有效地使用InterruptedException

时间:2015-04-23 11:48:49

标签: java android multithreading exception

  

给定代码在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循环。

修改

什么时候发生Interuption.It意味着另一个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]);
    }

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分: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();
}

答案 2 :(得分: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();
    }

}