Java Thread.sleep不会使我的应用程序崩溃

Java Thread.sleep不会使我的应用程序崩溃,java,android,multithreading,crash,Java,Android,Multithreading,Crash,通过在UI线程上调用Thread.sleep,我希望我的android应用程序崩溃,但事实并非如此 我尝试在UI线程上显式运行它,使用runOnUiThread,但结果是一样的,应用程序冻结但没有崩溃 在UI线程上使用Thread.sleep(6000)时,我是否应该期望应用程序崩溃 public class CrashActivity extends Activity { @Override protected void onResume() { super.onResume();

通过在UI线程上调用
Thread.sleep
,我希望我的android应用程序崩溃,但事实并非如此

我尝试在UI线程上显式运行它,使用
runOnUiThread
,但结果是一样的,应用程序冻结但没有崩溃

在UI线程上使用
Thread.sleep(6000)
时,我是否应该期望应用程序崩溃

public class CrashActivity extends Activity {

@Override
protected void onResume() {
    super.onResume();

    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            try {
                Thread.sleep(50000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    });
}
我正在尝试模拟ANR

Thread.sleep(毫秒)
“使当前正在执行的线程睡眠(暂时停止执行)指定毫秒数”

意味着

如果在主线程(即UI线程)上调用
Thread.sleep()
,它将冻结UI,并导致线程在给定的时间内完全停止执行;所以,若并没有其他线程需要运行,CPU将进入空闲模式。我认为这不会产生ANR

如果某个大型操作要在UI线程上操作,则会发生ANR情况。考虑这个计算例子…

如果您单击按钮并执行如下代码-

public void onClick(View v) {
    ....
    int a = 1;
    while(true) {
       a++;
    }
}
这将导致
ANR

以下是一些关于ANR的参考资料-


查看此文档,如前所述,Thread.sleep()不会自行使应用程序崩溃。它只会在您作为参数传递的毫秒数内将线程置于睡眠模式

场景1

您正在主线程中执行Thread.sleep。UI响应停止或冻结。这意味着用户无法与应用程序进行任何交互

如果您的超时时间很高,比如说30分钟,并且您一直试图与应用程序交互,那么操作系统将给您一个强制退出程序的机会

场景2

您正在另一个线程中执行Thread.sleep(),或者异步执行。您的应用程序将响应您的所有交互。它也不会使您的应用程序崩溃

对于后台任务,您可以使用


如果要刺激ANR,则不要调用Thread.sleep()。这是行不通的。
只要启动任何需要很长时间才能执行的函数。比如在主活动中加载一个巨大的图像文件等等。

我不希望它崩溃,但它会冻结用户界面。为什么你的应用程序会崩溃?你的问题很模糊,没有任何代码。你真的想知道为什么你的应用程序没有崩溃吗?答案是因为它不应该。没有错误的代码。我本来希望Android操作系统停止我的应用程序,因为冻结了UI线程。AFAIK线程。睡眠不会因为你决定调用它而崩溃。我正在尝试模拟ANR,但调用
thread.sleep
,它似乎不会发生。我做了一些关于ANR的研究。编辑了关于我发现的内容的答案。ANR(应用程序N到R对应)是由于在主线程(UI线程)中处理长时间运行的任务。如果主线程停止超过5秒,则会得到ANR。