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