Android.Countdownlatch.Await不能工作



我不知道我做错了什么。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()的调用都不会阻塞,因为倒计时已经到达。

我现在还不清楚你想要达到什么目标,但如果你能提供更多的细节,我可能会提供进一步的建议。

最新更新