我不知道我在做什么错。 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()
方法。
从Java8 JavaDoc中获取 CountDownLatch
:
在当前代码中,您的闩锁的倒计时为1(从示例new CountDownLatch(1);
的第一行开始)。在您正在调用await()
的两个位置中,都紧接在您调用countDown()
之前,这导致锁存器的倒计时达到0(甚至更少)。因此,对await()
的任何调用甚至都不会阻止,因为已经达到了倒计时。
目前尚不清楚您要完成的工作,但是如果您提供更多详细信息,我可能会提供进一步的建议。