Android系统。 Countdownlatch.await不起作用

时间:2014-06-11 19:01:04

标签: java android multithreading

我不知道我在这里做错了什么。 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);

}

1 个答案:

答案 0 :(得分:3)

我不确定您是否了解CountDownLatch的工作原理。 countDown()方法和await()方法通常在单独的线程中调用。

来自CountDownLatch的Java8 JavaDoc:

  

使用给定计数初始化CountDownLatch。由于countDown()方法的调用,await方法阻塞直到当前计数达到零,之后释放所有等待的线程,并且任何后续的await调用立即返回。这是一次性现象 - 计数无法重置。如果您需要一个重置计数的版本,请考虑使用CyclicBarrier。

在您当前的代码中,您的闩锁的倒计时为1(从示例new CountDownLatch(1);的第一行开始)。在您呼叫await()的两个位置,您都会立即呼叫countDown(),这会导致您的锁定倒计时达到0(甚至更低)。因此,对await()的任何调用都不会阻止,因为已经达到了倒计时。

我不能立即了解您要完成的任务,但如果您提供更多详细信息,我可以提供进一步的建议。

相关问题