我不知道我在这里做错了什么。 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);
}
答案 0 :(得分:3)
我不确定您是否了解CountDownLatch
的工作原理。 countDown()
方法和await()
方法通常在单独的线程中调用。
来自CountDownLatch
的Java8 JavaDoc:
使用给定计数初始化CountDownLatch。由于countDown()方法的调用,await方法阻塞直到当前计数达到零,之后释放所有等待的线程,并且任何后续的await调用立即返回。这是一次性现象 - 计数无法重置。如果您需要一个重置计数的版本,请考虑使用CyclicBarrier。
在您当前的代码中,您的闩锁的倒计时为1(从示例new CountDownLatch(1);
的第一行开始)。在您呼叫await()
的两个位置,您都会立即呼叫countDown()
,这会导致您的锁定倒计时达到0(甚至更低)。因此,对await()
的任何调用都不会阻止,因为已经达到了倒计时。
我不能立即了解您要完成的任务,但如果您提供更多详细信息,我可以提供进一步的建议。