2013-10-24 3 views
0

В настоящее время я пишу приложение 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 
} 

ответ

0

Используйте класс 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 просто обеспечивает более расширяемое решение.

0

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

Смежные вопросы