`
谁家大叶
  • 浏览: 490 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

CountDownLatch用来延时主进程

阅读更多
我需要在调服务器之后得到数据,并用textview显示。所以我需要在主线程中开启了一个子线程来执行访问服务器操作,返回值依赖于子线程的执行结果,这样如果要返回正确的值,就需要开启子线程后,主线程等待子线程,然后子线程执行结束后,主线程再继续执行。
我们用到了CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
CountDownLatch的一个非常典型的应用场景是:有一个任务想要往下执行,但必须要等到其他的任务执行完毕后才可以继续往下执行。假如我们这个想要继续往下执行的任务调用一个CountDownLatch对象的await()方法,其他的任务执行完自己的任务后调用同一个CountDownLatch对象上的countDown()方法,这个调用await()方法的任务将一直阻塞等待,直到这个CountDownLatch对象的计数值减到0为止。
直接上代码:
1、(这是oncreate
中的部分程序)
//等待子线程结束程序
CountDownLatch cdl =new CountDownLatch(1);
new waitThread(cdl).start();
try{
    cdl.await();
}catch (InterruptedException e){
e.printStackTrace();
}
sign_in_tv.setText(sign_num+"");
all_num_tv.setText(all_num + "");
//等待子线程结束得到sign_num和all_num 

2、创建的一个Thread类
public class waitThread extends Thread{
    private  CountDownLatch cdl;
    public waitThread(CountDownLatch cdl){
        this.cdl =cdl;
    }
    @Override
    public void run() {
        //获取数据
。。。。。。[color=gray][/color]省略访问服务器和数据解析
            sign_num = data.getInt("sign_in_num");
            all_num = data.getInt("num");
            cdl.countDown();   //在run里面调用
    }
}
这样就实现了主线程等待子线程结束后再执行。

CountDownLatch类有3个基本元素:
1) 初始值决定CountDownLatch类需要等待的事件的数量。
2) await() 方法, 被等待全部事件终结的线程调用。
3) countDown() 方法,事件在结束执行后调用。
当创建 CountDownLatch 对象时,对象使用构造函数的参数来初始化内部计数器。每次调用 countDown() 方法, CountDownLatch 对象内部计数器减一。当内部计数器达到0时, CountDownLatch 对象唤醒全部使用 await() 方法睡眠的线程们。
不可能重新初始化或者修改CountDownLatch对象的内部计数器的值。一旦计数器的值初始后,唯一可以修改它的方法就是之前用的 countDown() 方法。当计数器到达0时, 全部调用 await() 方法会立刻返回,接下来任何countDown() 方法的调用都将不会造成任何影响。
[/color]
分享到:
评论

相关推荐

    多线程countDownLatch方法介绍

    2. 数据库连接池:数据库连接池在初始化时可能需要创建多个连接,完成后才允许客户端使用,CountDownLatch可以用来同步这一过程。 3. 多线程并行计算:在并行计算场景中,可以利用CountDownLatch确保所有子任务执行...

    CountDownLatch和CyclicBarrier用法实例大全

    这在多线程环境中常用来确保所有线程都完成特定的准备工作后,再一起开始执行后续的操作。 1. **初始化**: 通过`CountDownLatch(int count)`构造函数初始化,`count`表示倒计时的次数。 2. **countDown()**: 当一个...

    利用 CountDownLatch 类实现线程同步

    Java 提供了多种工具来实现这样的同步机制,其中之一便是 `CountDownLatch` 类。`CountDownLatch` 是一个计数器,可以用于协调多个线程间的活动,等待所有线程完成各自的任务后,主线程或其他线程才能继续执行。 ...

    java并发编程中CountDownLatch和CyclicBarrier的使用借鉴.pdf

    在上面的例子中, CountDownLatch被用来模拟百米赛跑的场景,其中八名运动员同时起跑,由于速度的快慢,肯定会出现先到终点和晚到终点的情况,而终点有个统计成绩的仪器,当所有选手到达终点时,它会统计所有人的...

    CountDownLatch学习用法

    CountDownLatch是Java并发编程中一个重要的工具类,它属于java.util.concurrent包下的一个同步辅助类。这个类的设计目的是允许一个线程等待其他多个线程完成操作,然后再继续执行。CountDownLatch通常用于多线程协作...

    CountDownLatch练习

    - **启动前等待**: 例如,一个主程序可能需要等待多个初始化任务完成后再继续运行。 - **测试框架**: 测试类可能需要等待所有测试线程完成后再进行结果汇总。 - **数据加载**: 在所有数据加载线程完成加载后,应用...

    并发编程之CountDownLatch

    在实际开发中,CountDownLatch 可以用来实现主线程和子线程之间的通信,例如主线程发送命令启动子线程,子线程全部完成后通知主线程。 CountDownLatch 的工作机理是通过构造函数中的计数值来实现的,这个值只能被...

    CountDownLatch的使用

    递减锁存器CountDownLatch的使用以及注意事项!

    mybaits 多线程 实现数据批量插入 (运用CountDownLatch实现闭锁)

    本文将详细介绍如何利用MyBatis结合多线程和CountDownLatch闭锁来实现数据的批量插入。 首先,我们来看`mybatis批处理`。MyBatis的批处理功能允许我们在一次数据库连接中执行多条SQL语句,从而减少了数据库连接的...

    CountDownLatch与thread.join()的区别

    CountDownLatch与thread.join()的区别

    CountDownLatch Demo

    CountDownLatch 是 Java 多线程并发编程中一个重要的同步工具类,主要用来协调多个线程间的协作,确保某个任务在所有线程完成之前不会开始。在这个"CountDownLatch Demo"中,我们将深入理解 CountDownLatch 的原理、...

    CountDownLatch详解.docx

    - `getCount()`: 返回当前计数器的值,可以用来检查还有多少线程或操作步骤需要完成。 3. **使用示例**: 在提供的示例代码中,我们创建了一个 CountDownLatch 实例,初始值为3,表示有3个工作线程需要完成任务。...

    JAVA多线程CountDownLatch使用详解

    JAVA多线程CountDownLatch是JAVA多线程编程中的一种同步工具,主要用来让某个线程等待其他线程执行完毕后再继续执行。下面我们将详细介绍JAVA多线程CountDownLatch的使用和原理。 什么时候用CountDownLatch? 在多...

    countdownlatch-example-sourcecode.zip

    - 在主程序中创建CountDownLatch实例并初始化,如`CountDownLatch latch = new CountDownLatch(n)`,其中n表示需要完成的任务数量。 - 启动n个线程执行各自的任务,每个任务完成后调用`countDown()`方法。 - 主线...

    Java中CountDownLatch进行多线程同步详解及实例代码

    CountDownLatch是Java中的一种多线程同步辅助类,主要用来同步多个任务的执行。它允许一个或多个线程等待,直到一组正在其他线程中执行的操作完成。下面是对CountDownLatch的详细解释和实例代码。 CountDownLatch的...

    Java中CountDownLatch用法解析

    在上述例子中,它被用来模拟一场有5位运动员的比赛,确保所有运动员都准备好后比赛才开始,并且所有运动员都完成比赛后比赛才结束。 首先,我们来看一下`CountDownLatch`的基本原理。构造`CountDownLatch`时需要...

    android 延时或重复执行任务

    `Timer`类是Java提供的一个计时器类,可以用来调度任务在未来某个时间点执行或者周期性地执行。`TimerTask`是实际的任务载体,它继承自`Runnable`。创建`Timer`对象后,通过`schedule(TimerTask task, long delay)`...

    Java中的CountDownLatch与CyclicBarrier:深入理解与应用实践

    在Java的并发编程中,CountDownLatch和CyclicBarrier是两个非常重要的同步工具,它们用于协调多个线程的执行顺序。本文将详细介绍CountDownLatch和CyclicBarrier的工作原理、使用场景以及如何在实际项目中应用它们。...

    CountDownLatch同步工具类使用详解

    CountDownLatch的用法非常简单,它可以用来控制线程的执行顺序,使得某些线程能够等待其他线程执行完成后再执行。 使用CountDownLatch可以解决以下问题: 1. 等待多个线程执行完成:CountDownLatch可以使得一个...

    Java并发包之CountDownLatch用法.docx

    在这个例子中,`CountDownLatchTest`的主方法创建了3个线程模拟3位乘客登机,`CountDownLatch`的计数器初始化为3。当所有乘客登机完成后,主线程会继续执行并宣布飞机起飞。 `CountDownLatch`在并行任务拆分和优化...

Global site tag (gtag.js) - Google Analytics