Java 安卓Countdownlatch.await不工作

Java 安卓Countdownlatch.await不工作,java,android,multithreading,Java,Android,Multithreading,我不知道我做错了什么。Countdownlatch.await不工作。绝对没有等待时间。我用荒谬的数字(50秒)进行了测试,并让电话留言立即出现。我试图在UI线程上使用它。我还运行了另一个线程 代码: private final CountDownLatch闩锁=新的CountDownLatch(1)//早些时候打过电话 void方法(){ //代码 Runnable flashScreen=新的Runnable(){ @凌驾 公开募捐{ 闪屏(); } }; runOnUiThread(闪屏)

我不知道我做错了什么。Countdownlatch.await不工作。绝对没有等待时间。我用荒谬的数字(50秒)进行了测试,并让电话留言立即出现。我试图在UI线程上使用它。我还运行了另一个线程

代码:

private final CountDownLatch闩锁=新的CountDownLatch(1)//早些时候打过电话
void方法(){
//代码
Runnable flashScreen=新的Runnable(){
@凌驾
公开募捐{
闪屏();
}
};
runOnUiThread(闪屏);
//模式代码
}
私有void flashScreen()
{
最终文本视图monthDayYear=(文本视图)findViewById(R.id.月\日\年);
最终文本视图小时数秒=(文本视图)findViewById(R.id.hour\u minutes\u second);
//获取日期和时间
final SyncModule SyncModule=_application.getSyncModule();
syncModule.start();
while(counter.intValue()<150){
试一试{
//睡眠(10);
倒计时();
等待(10,时间单位毫秒);
counter.incrementAndGet();
}捕获(中断异常例外){
Util.appendLog(“SyncActivity:InterruptedException while flash camera”+ex.getMessage());
}
}
最终ImageView fadeView=(ImageView)findViewById(R.id.sync\u flash\u矩形);
fadeView.setBackgroundColor(颜色:白色);
fadeIn(fadeView,1,0,1000,真);
Calendar syncTime=syncModule.getDateAndTime();
monthDayYear.setText(新的SimpleDayTeFormat(“MM/dd/yyyy”).format(syncTime.getTime());
hourMinuteSecond.setText(新的SimpleDataFormat(“HH:mm:ss:00”).format(syncTime.getTime());
试一试{
倒计时();
等待(50,时间单位秒);
}捕获(中断异常例外){
Util.appendLog(“SyncActivity:InterruptedException while flash camera”+ex.getMessage());
}
计数器组(1000);
}

我不确定您是否理解
倒计时锁存器的工作原理。
countDown()
方法和
await()
方法通常在单独的线程中调用

从Java8 JavaDoc获取:

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

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


我现在还不清楚您想要实现什么,但如果您提供更多详细信息,我可能可以提供进一步的建议。

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

从Java8 JavaDoc获取:

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

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


我现在还不清楚你想实现什么目标,但如果你能提供更多细节,我也许能提供进一步的建议。

+1。本质上,OP,你说的是“我准备好了。现在,等我准备好了。”第二个语句立即返回,因为第一个语句。我想等待10毫秒,然后再递增
AtomicLong
计数器,因为我想“同步”两个项目,以便它们同时出现(对齐相机和屏幕闪光灯)。等待是为了确保相机有足够的时间打开,因为这似乎非常慢。我宁愿使用
线程。sleep(10)
调用,但这会冻结UI线程(如预期的那样)。我可能只需要查看一切工作方式,并在线程上运行UI更新(与计数器分开),以便在将来的某个时候执行代码。请查看类
ScheduledExecutorService
Executors
类提供工厂方法来构造这些函数。本质上,OP,你说的是“我准备好了。现在,等我准备好了。”第二个语句立即返回,因为第一个语句。我想等待10毫秒,然后再递增
AtomicLong
计数器,因为我想“同步”两个项目,以便它们同时出现(对齐相机和屏幕闪光灯)。等待是为了确保相机有足够的时间打开,因为这似乎非常慢。我宁愿使用
线程。sleep(10)
调用,但这会冻结UI线程(如预期的那样)。我可能只需要看看一切是如何工作的,然后在线程上运行UI更新(与计数器分开),以便在将来的chec中的某个时候执行代码
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);

}