Can't pause / sleep thread inside for loop

Issue

How can i sleep thread, from inside of for loop .

This is what i’m trying but there is no sleep .

Thread newTread = new Thread() {

    @Override
    public void run() {

        for (int x = 0; x < limit; x++) {

            //some_code

            try {
                 Thread.sleep(3000);
            }
            catch (Exception e){
                 e.getLocalizedMessage();
            }

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    //someCode       
                    }
                });
            }
        }
    };
    newTread.start();

Is there something wrong with my code ?

Solution

I’ve gone ahead and thrown the code into a project of my own, with some added debugging code. Here’s the code I used and output I received.

    Thread newTread = new Thread() {

        @Override
        public void run() {

            for (int x = 0; x < 3; x++) {

                Log.d("ThreadTest","1");

                try {
                    Log.d("ThreadTest","2");
                    Thread.sleep(3000);
                    Log.d("ThreadTest", "3");
                }
                catch (Exception e){
                    e.printStackTrace();
                }

                Log.d("ThreadTest","4");
                runOnUiThread(new Runnable() {
                                  @Override
                                  public void run() {
                                      Log.d("ThreadTest","5");
                                  }
                              });
            }
        }
    };
    newTread.start();

11-04 08:23:38.920 11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer
D/ThreadTest: 1 11-04 08:23:38.920
11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer
D/ThreadTest: 2 11-04 08:23:41.920
11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer
D/ThreadTest: 3 11-04 08:23:41.920
11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer
D/ThreadTest: 4 11-04 08:23:41.920
11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer
D/ThreadTest: 1 11-04 08:23:41.920
11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer
D/ThreadTest: 2 11-04 08:23:41.920
11419-11419/nl.buroboot.danielvandenberg.bootsnelleinvoer
D/ThreadTest: 5 11-04 08:23:44.920
11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer
D/ThreadTest: 3 11-04 08:23:44.920
11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer
D/ThreadTest: 4 11-04 08:23:44.920
11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer
D/ThreadTest: 1 11-04 08:23:44.920
11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer
D/ThreadTest: 2 11-04 08:23:44.920
11419-11419/nl.buroboot.danielvandenberg.bootsnelleinvoer
D/ThreadTest: 5 11-04 08:23:47.920
11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer
D/ThreadTest: 3 11-04 08:23:47.920
11419-11452/nl.buroboot.danielvandenberg.bootsnelleinvoer
D/ThreadTest: 4 11-04 08:23:47.920
11419-11419/nl.buroboot.danielvandenberg.bootsnelleinvoer
D/ThreadTest: 5

In my case the code did actually wait for three seconds, so nothing seems wrong with that. What is interesting to note, however, is the fact that the “5” can appear after the next 1. This is because of the way runOnUiThread works. What it does, is it puts the runnable you provide on a queue. From this queue, android will grab one runnable at a time and run it when the Ui thread has time to run it. This means that, if you were to do something like this:

    newTread.start();
    boolean a = true;
    while (a){
        try {
            Thread.sleep(1);
            a = a;
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

you’ll get a log like:

11-04 08:27:51.810
14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer
D/ThreadTest: 1 11-04 08:27:51.815
14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer
D/ThreadTest: 2 11-04 08:27:54.815
14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer
D/ThreadTest: 3 11-04 08:27:54.815
14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer
D/ThreadTest: 4 11-04 08:27:54.815
14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer
D/ThreadTest: 1 11-04 08:27:54.815
14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer
D/ThreadTest: 2 11-04 08:27:57.815
14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer
D/ThreadTest: 3 11-04 08:27:57.815
14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer
D/ThreadTest: 4 11-04 08:27:57.815
14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer
D/ThreadTest: 1 11-04 08:27:57.815
14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer
D/ThreadTest: 2 11-04 08:28:00.815
14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer
D/ThreadTest: 3 11-04 08:28:00.815
14909-14942/nl.buroboot.danielvandenberg.bootsnelleinvoer
D/ThreadTest: 4

Note that there isn’t a single 5 in there. This is because the UI-thread is too busy to execute the stack. I’m guessing this is exactly what’s happening to you.

My recommendation for fixing this: Breakpoints. Try to figure out if, and if so where, your UI thread is hanging, and solve that. This code functions as it should.

Answered By – Daniël van den Berg

Answer Checked By – Pedro (FlutterFixes Volunteer)

Leave a Reply

Your email address will not be published. Required fields are marked *