0

我目前正在编写一个需要大量调用 Twitter API 的 Java 应用程序。因此,我不得不担心超出速率限制。我发现我每 14 分钟可以进行 180 次调用,然后我必须等待一段时间才能再次开始调用 API(这个数字在应用程序中返回)。所以,当调用达到一定数量时,我的线程会休眠。我的意图是让线程在 sleep() 结束时自动从中断的地方开始。这行得通还是我必须担心 CPU 调度和类似的事情!?

也许我不完全理解睡眠应该如何工作。任何帮助将不胜感激,看看我所做的是否正确。谢谢!

下面只是几行伪代码:

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
}
4

2 回答 2

0

IIRC,在Java中,您可以使用 object.wait() 超时。这不是你想要的吗?如果您想从另一个线程更改超时,请更改一些“waitValue”变量和 notify()。然后线程将“立即”运行,然后再次等待新的超时值。不需要明确的睡眠。

于 2014-12-31T07:19:53.693 回答
0

使用 CyclicBarrier 类。

来自 CyclicBarrier 的 javadoc 的示例:

 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 只是提供了更多可扩展的解决方案。

于 2013-10-24T16:01:27.470 回答