我目前正在编写一个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
}
答案 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'变量并通知()。然后线程将“立即”运行,然后再次使用新的超时值。不需要明确的睡眠。