Как «дождаться» потока в Android

#java #android #multithreading

#java #Android #многопоточность

Вопрос:

 private void startGameTimeElapseThread(){
    new Thread(new Runnable() {
        Date d = new Date();
        public void run() {
            while (gameOn){
                Log.d(TAG,"" d.getTime() " " gameStatus.getLastTimeUpdated());

                postInvalidate(795, 150, 1024, 300);
                try {
                    synchronized (this) {
                        wait(1000); 
                    }
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    Log.d(TAG, "Waiting didnt work!!");
                    e.printStackTrace();
                }
            }
        }
    }).start();
}
  

Здесь я хотел заставить вызывать «Log.d» и «postInvalidate» каждую секунду. Но когда я проверяю это из LogCat, кажется, что цикл выполняется быстрее, чем я хочу, чтобы это было. Почему этот цикл просто не ожидает 1000 мс?

Ниже приведены выходные данные в LogCat. Таким образом, вы можете видеть, что он вообще не спит в течение 1 секунды. Я также использовал Thread.sleep (после вашего предложения)

 05-27 11:40:10.060: DEBUG/NOPSA-P(4546): 1306496408950 1306496387535
05-27 11:40:10.070: DEBUG/NOPSA-P(4546): 1306496410037 1306496387535
05-27 11:40:10.232: DEBUG/NOPSA-P(4546): 1306496410201 1306496387535
05-27 11:40:10.250: DEBUG/NOPSA-P(4546): 1306496408214 1306496387535
05-27 11:40:10.310: DEBUG/NOPSA-P(4546): 1306496405988 1306496387535
05-27 11:40:10.361: DEBUG/NOPSA-P(4546): 1306496409327 1306496387535
05-27 11:40:10.431: DEBUG/NOPSA-P(4546): 1306496410398 1306496387535
05-27 11:40:10.521: DEBUG/NOPSA-P(4546): 1306496409478 1306496387535
05-27 11:40:10.593: DEBUG/NOPSA-P(4546): 1306496410566 1306496387535
05-27 11:40:11.230: DEBUG/NOPSA-P(4546): 1306496409678 1306496387535
05-27 11:40:11.230: DEBUG/NOPSA-P(4546): 1306496410201 1306496387535
05-27 11:40:11.241: DEBUG/NOPSA-P(4546): 1306496409878 1306496387535
05-27 11:40:11.241: DEBUG/NOPSA-P(4546): 1306496410037 1306496387535
05-27 11:40:11.241: DEBUG/NOPSA-P(4546): 1306496408950 1306496387535
05-27 11:40:11.260: DEBUG/NOPSA-P(4546): 1306496408214 1306496387535
05-27 11:40:11.314: DEBUG/NOPSA-P(4546): 1306496405988 1306496387535
05-27 11:40:11.314: DEBUG/NOPSA-P(4546): 1306496411254 1306496387535
05-27 11:40:11.361: DEBUG/NOPSA-P(4546): 1306496409327 1306496387535
05-27 11:40:11.431: DEBUG/NOPSA-P(4546): 1306496410398 1306496387535
05-27 11:40:11.520: DEBUG/NOPSA-P(4546): 1306496409478 1306496387535
05-27 11:40:11.551: DEBUG/NOPSA-P(4546): 1306496411508 1306496387535
05-27 11:40:11.712: DEBUG/NOPSA-P(4546): 1306496410566 1306496387535
05-27 11:40:11.881: DEBUG/NOPSA-P(4546): 1306496411865 1306496387535
05-27 11:40:12.051: DEBUG/NOPSA-P(4546): 1306496412025 1306496387535
05-27 11:40:12.211: DEBUG/NOPSA-P(4546): 1306496412198 1306496387535
05-27 11:40:12.231: DEBUG/NOPSA-P(4546): 1306496409678 1306496387535
05-27 11:40:12.242: DEBUG/NOPSA-P(4546): 1306496410201 1306496387535
05-27 11:40:12.251: DEBUG/NOPSA-P(4546): 1306496408950 1306496387535
05-27 11:40:12.251: DEBUG/NOPSA-P(4546): 1306496409878 1306496387535
05-27 11:40:12.251: DEBUG/NOPSA-P(4546): 1306496410037 1306496387535
05-27 11:40:12.261: DEBUG/NOPSA-P(4546): 1306496408214 1306496387535
05-27 11:40:12.311: DEBUG/NOPSA-P(4546): 1306496405988 1306496387535
05-27 11:40:12.341: DEBUG/NOPSA-P(4546): 1306496411254 1306496387535
05-27 11:40:12.371: DEBUG/NOPSA-P(4546): 1306496409327 1306496387535
05-27 11:40:12.442: DEBUG/NOPSA-P(4546): 1306496410398 1306496387535
05-27 11:40:12.471: DEBUG/NOPSA-P(4546): 1306496412431 1306496387535
05-27 11:40:12.521: DEBUG/NOPSA-P(4546): 1306496409478 1306496387535
05-27 11:40:12.553: DEBUG/NOPSA-P(4546): 1306496411508 1306496387535
05-27 11:40:12.671: DEBUG/NOPSA-P(4546): 1306496412639 1306496387535
05-27 11:40:12.711: DEBUG/NOPSA-P(4546): 1306496410566 1306496387535
05-27 11:40:12.841: DEBUG/NOPSA-P(4546): 1306496412813 1306496387535
05-27 11:40:12.891: DEBUG/NOPSA-P(4546): 1306496411865 1306496387535
05-27 11:40:13.001: DEBUG/NOPSA-P(4546): 1306496412983 1306496387535
05-27 11:40:13.051: DEBUG/NOPSA-P(4546): 1306496412025 1306496387535
05-27 11:40:13.193: DEBUG/NOPSA-P(4546): 1306496413166 1306496387535
05-27 11:40:13.231: DEBUG/NOPSA-P(4546): 1306496409678 1306496387535
05-27 11:40:13.251: DEBUG/NOPSA-P(4546): 1306496410201 1306496387535
05-27 11:40:13.251: DEBUG/NOPSA-P(4546): 1306496409878 1306496387535
05-27 11:40:13.251: DEBUG/NOPSA-P(4546): 1306496410037 1306496387535
05-27 11:40:13.251: DEBUG/NOPSA-P(4546): 1306496408950 1306496387535
05-27 11:40:13.261: DEBUG/NOPSA-P(4546): 1306496408214 1306496387535
05-27 11:40:13.271: DEBUG/NOPSA-P(4546): 1306496412198 1306496387535
05-27 11:40:13.321: DEBUG/NOPSA-P(4546): 1306496405988 1306496387535
05-27 11:40:13.341: DEBUG/NOPSA-P(4546): 1306496411254 1306496387535
05-27 11:40:13.371: DEBUG/NOPSA-P(4546): 1306496409327 1306496387535
05-27 11:40:13.431: DEBUG/NOPSA-P(4546): 1306496413405 1306496387535
05-27 11:40:13.441: DEBUG/NOPSA-P(4546): 1306496410398 1306496387535
05-27 11:40:13.481: DEBUG/NOPSA-P(4546): 1306496412431 1306496387535
05-27 11:40:13.532: DEBUG/NOPSA-P(4546): 1306496409478 1306496387535
  

Это последний код. gameOn является логическим значением, на данный момент это правда.

 private void startGameTimeElapseThread(){
    if (gameOn){
        new Thread(new Runnable() {
            Date d = new Date();
            public void run() {

                    Log.d(TAG,"" d.getTime() "ms  " d.getTime()/1000 "sec");
                    postInvalidate(795, 150, 1024, 300);
                    android.os.SystemClock.sleep(1000); 
                    startGameTimeElapseThread();

            }
        }).start();
    }
}
  

Результат таков

 05-27 12:00:51.211: DEBUG/NOPSA-P(5098): 1306497650761ms  1306497650sec
05-27 12:00:51.211: DEBUG/NOPSA-P(5098): 1306497650786ms  1306497650sec
05-27 12:00:51.221: DEBUG/NOPSA-P(5098): 1306497650764ms  1306497650sec
05-27 12:00:51.221: DEBUG/NOPSA-P(5098): 1306497650763ms  1306497650sec
05-27 12:00:51.221: DEBUG/NOPSA-P(5098): 1306497650769ms  1306497650sec
05-27 12:00:51.231: DEBUG/NOPSA-P(5098): 1306497650749ms  1306497650sec
05-27 12:00:51.231: DEBUG/NOPSA-P(5098): 1306497650736ms  1306497650sec
05-27 12:00:51.231: DEBUG/NOPSA-P(5098): 1306497650742ms  1306497650sec
05-27 12:00:51.241: DEBUG/NOPSA-P(5098): 1306497650746ms  1306497650sec
05-27 12:00:51.241: DEBUG/NOPSA-P(5098): 1306497650848ms  1306497650sec
05-27 12:00:51.251: DEBUG/NOPSA-P(5098): 1306497650729ms  1306497650sec
05-27 12:00:51.271: DEBUG/NOPSA-P(5098): 1306497650739ms  1306497650sec
05-27 12:00:51.271: DEBUG/NOPSA-P(5098): 1306497650739ms  1306497650sec
05-27 12:00:51.271: DEBUG/NOPSA-P(5098): 1306497650868ms  1306497650sec
05-27 12:00:51.271: DEBUG/NOPSA-P(5098): 1306497650798ms  1306497650sec
05-27 12:00:51.281: DEBUG/NOPSA-P(5098): 1306497650870ms  1306497650sec
05-27 12:00:51.291: DEBUG/NOPSA-P(5098): 1306497651020ms  1306497651sec
05-27 12:00:51.551: DEBUG/NOPSA-P(5098): 1306497651498ms  1306497651sec
05-27 12:00:51.551: DEBUG/NOPSA-P(5098): 1306497651502ms  1306497651sec
05-27 12:00:51.642: DEBUG/NOPSA-P(5098): 1306497651523ms  1306497651sec
05-27 12:00:51.651: DEBUG/NOPSA-P(5098): 1306497651537ms  1306497651sec
05-27 12:00:51.691: DEBUG/NOPSA-P(5098): 1306497651529ms  1306497651sec
05-27 12:00:51.701: DEBUG/NOPSA-P(5098): 1306497651534ms  1306497651sec
05-27 12:00:51.784: DEBUG/NOPSA-P(5098): 1306497651527ms  1306497651sec
05-27 12:00:51.801: DEBUG/NOPSA-P(5098): 1306497651570ms  1306497651sec
05-27 12:00:51.801: DEBUG/NOPSA-P(5098): 1306497651564ms  1306497651sec
05-27 12:00:51.891: DEBUG/NOPSA-P(5098): 1306497651682ms  1306497651sec
05-27 12:00:51.891: DEBUG/NOPSA-P(5098): 1306497651690ms  1306497651sec
05-27 12:00:51.891: DEBUG/NOPSA-P(5098): 1306497651685ms  1306497651sec
05-27 12:00:51.901: DEBUG/NOPSA-P(5098): 1306497651693ms  1306497651sec
05-27 12:00:51.914: DEBUG/NOPSA-P(5098): 1306497651647ms  1306497651sec
05-27 12:00:51.914: DEBUG/NOPSA-P(5098): 1306497651667ms  1306497651sec
05-27 12:00:51.921: DEBUG/NOPSA-P(5098): 1306497651666ms  1306497651sec
05-27 12:00:51.921: DEBUG/NOPSA-P(5098): 1306497651658ms  1306497651sec
05-27 12:00:51.921: DEBUG/NOPSA-P(5098): 1306497651663ms  1306497651sec
05-27 12:00:51.932: DEBUG/NOPSA-P(5098): 1306497651688ms  1306497651sec
05-27 12:00:51.941: DEBUG/NOPSA-P(5098): 1306497651711ms  1306497651sec
05-27 12:00:51.961: DEBUG/NOPSA-P(5098): 1306497651792ms  1306497651sec
05-27 12:00:51.971: DEBUG/NOPSA-P(5098): 1306497651629ms  1306497651sec
05-27 12:00:51.981: DEBUG/NOPSA-P(5098): 1306497651714ms  1306497651sec
05-27 12:00:52.083: DEBUG/NOPSA-P(5098): 1306497652048ms  1306497652sec
  

Ответ №1:

Вам нужен sleep метод Thread класса.

public static void sleep (long time)

Переводит поток, отправивший это сообщение, в спящий режим на заданный интервал времени (задается в миллисекундах). Точность не гарантируется — поток может находиться в режиме ожидания больше или меньше запрошенного.

Параметры

time Время перехода в спящий режим исчисляется миллисекундами.

Комментарии:

1. @dinesh707: вы вызываете startGameTimeElapseThread() методы несколько раз, что создает один поток за вызов. просто вызовите один раз и посмотрите.

2. @dinesh707: может быть, зарегистрировать Thread.currentThread().getName() вывод и проверить себя.

Ответ №2:

Не используйте wait() , используйте либо android.os.SystemClock.sleep(1000); , либо Thread.sleep(1000); .

Основное различие между ними заключается в том, что Thread.sleep() вас могут прервать раньше — вам скажут, но это все еще не полная секунда. android.os Вызов не будет запущен раньше.

Комментарии:

1. Выходные данные также не совпадают с вашими инструкциями журнала, поскольку первый столбец не является ни стационарным (как я думаю, это должно быть, учитывая, что ваш сокращенный код — d никогда не обновляется), ни строго увеличивающимся. Временные метки слева согласны с вами, хотя — вы не спите целую секунду. Можете ли вы обновить свой код в этом посте?

Ответ №3:

Я просто добавляю эту строку точно так, как она приведена ниже (если вам нужна вторая задержка):

 try {
    Thread.sleep(1000);
} catch(InterruptedException e) {
    // Process exception
}
  

Я считаю, что уловка необходима (ваше приложение может вылететь из-за ОС Android в той же степени, что и ваш собственный код).

Ответ №4:

Вы можете попробовать этот, он короткий 🙂

 SystemClock.sleep(7000);
  

Он будет находиться в режиме ожидания в течение 7 секунд
посмотрите на документацию

Ответ №5:

Напишите, Thread.sleep(1000); это переведет поток в спящий режим на 1000 мс