睡觉后继续线程

时间:2013-10-24 15:58:08

标签: java sleep wakeup

我目前正在编写一个Java应用程序,需要对Twitter API进行大量调用。因此,我不得不担心超出限额。我发现我可以每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
}

2 个答案:

答案 0 :(得分: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只是提供了更具扩展性的解决方案。

答案 1 :(得分:0)

IIRC,在Java中你可以使用超时来对象。()。这不是你想要的吗?如果要更改另一个线程的超时,请更改一些'waitValue'变量并通知()。然后线程将“立即”运行,然后再次使用新的超时值。不需要明确的睡眠。