我不知道我做错了什么。Countdownlatch。Await不能工作。绝对没有等待时间。我用一些荒谬的数字(50秒)进行了测试,结果电话的余音立即出现了。我试图在UI线程上使用它。我还有另一个线程在运行。
代码:private final CountDownLatch latch = new CountDownLatch(1); //called earlier
void someMethod() {
//code
Runnable flashScreen = new Runnable() {
@Override
public void run() {
flashScreen();
}
};
runOnUiThread(flashScreen);
//Mode code
}
private void flashScreen()
{
final TextView monthDayYear = (TextView)findViewById(R.id.month_day_year);
final TextView hourMinuteSecond = (TextView)findViewById(R.id.hour_minute_second);
//Get date and time
final SyncModule syncModule = _application.getSyncModule();
syncModule.start();
while(counter.intValue() < 150) {
try {
//Thread.sleep(10);
latch.countDown();
latch.await(10, TimeUnit.MILLISECONDS);
counter.incrementAndGet();
} catch (InterruptedException ex) {
Util.appendLog("SyncActivity: InterruptedException while flashing camera " + ex.getMessage());
}
}
final ImageView fadeView = (ImageView)findViewById(R.id.sync_flash_rectangle);
fadeView.setBackgroundColor(Color.WHITE);
fadeIn(fadeView, 1, 0, 1000, true);
Calendar syncTime = syncModule.getDateAndTime();
monthDayYear.setText(new SimpleDateFormat("MM/dd/yyyy").format(syncTime.getTime()));
hourMinuteSecond.setText(new SimpleDateFormat("HH:mm:ss:00").format(syncTime.getTime()));
try {
latch.countDown();
latch.await(50, TimeUnit.SECONDS);
} catch (InterruptedException ex) {
Util.appendLog("SyncActivity: InterruptedException while flashing camera " + ex.getMessage());
}
counter.set(1000);
}
我不确定你是否理解CountDownLatch
是如何工作的。countDown()
方法和await()
方法通常在单独的线程中调用。
From Java8 JavaDoc for CountDownLatch
:
CountDownLatch用给定的计数初始化。由于调用了countDown()方法,await方法会一直阻塞,直到当前计数达到零为止,在此之后,所有等待线程都会被释放,任何后续的await方法调用都会立即返回。这是一个一次性现象——计数不能被重置。如果你需要一个重置计数的版本,可以考虑使用CyclicBarrier。
在当前代码中,闩锁的倒计时为1(从示例new CountDownLatch(1);
的第一行开始)。在您调用await()
的两个位置,您都立即在调用countDown()
之前,这导致您的锁存器倒计时达到0(甚至更少)。因此,任何对await()
的调用都不会阻塞,因为倒计时已经到达。
我现在还不清楚你想要达到什么目标,但如果你能提供更多的细节,我可能会提供进一步的建议。