Продолжая тему после сна

В настоящее время я пишу Java-приложение, которое требует довольно много вызовов API Twitter. Из-за этого мне приходится беспокоиться о превышении лимита скорости. Я понял, что могу делать 180 звонков за 14 минут, а затем мне нужно подождать некоторое время, прежде чем я смогу снова начать звонить в API (этот номер возвращается в приложении). Таким образом, когда звонки достигают определенного номера, я сплю. Мое намерение состоит в том, чтобы поток продолжал работать там, где он автоматически остановился, когда sleep() закончился. Это работает или мне нужно беспокоиться о планировании процессора и тому подобное!?

Может быть, я не совсем понимаю, как сон должен работать. Любая помощь будет с благодарностью увидеть, правильно ли то, что я делаю. Спасибо!

Ниже приведена пара строк псевдокода:

for (int i = 0; i < arr.length; i++) 
{
    if (calls are a certain number) 
    {
        Thread.sleep(840*1000);
        continue;
    }
      //CALL TO METHOD THAT REQUESTS INFORMATION FROM TWITTER API
}

2 ответа

IIRC, в Java вы можете возражать.wait() с таймаутом. Разве это не то, что вы хотите? Если вы хотите изменить тайм-аут из другого потока, измените некоторую переменную waitValue и notify(). Затем поток "немедленно" запустится, а затем снова будет ждать с новым значением времени ожидания. Нет явного сна не требуется.

Используйте класс CyclicBarrier.

Пример из Javadoc CyclicBarrier:

 class Solver {
   final int N;
   final float[][] data;
   final CyclicBarrier barrier;

   class Worker implements Runnable {
     int myRow;
     Worker(int row) { myRow = row; }
     public void run() {
       while (!done()) {
         processRow(myRow);

         try {
           barrier.await();
         } catch (InterruptedException ex) {
           return;
         } catch (BrokenBarrierException ex) {
           return;
         }
       }
     }
   }

   public Solver(float[][] matrix) {
     data = matrix;
     N = matrix.length;
     barrier = new CyclicBarrier(N,
                                 new Runnable() {
                                   public void run() {
                                     mergeRows(...);
                                   }
                                 });
     for (int i = 0; i < N; ++i)
       new Thread(new Worker(i)).start();

     waitUntilDone();
   }
 }

Для решения этой задачи вы можете использовать только два потока с простыми блокировками (также из java.util.concurrent). CyclicBarrier просто предоставляет более расширяемое решение.

Другие вопросы по тегам