`
407827531
  • 浏览: 1073959 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

android 简单线程同步之CountDownLatch

 
阅读更多

推荐安卓开发神器(里面有各种UI特效和android代码库实例)

 

当涉及到多线程的时候,一个经常出现的问题就是线程同步,这里介绍android一个很简单的多线程同步方案-------------CountDownLatch

 

我们直接看官方例子。这个例子有两个功能,

 

1.N个子线程等待主线程进行一些初始化工作doSomethingInit()之后,才运行子线程

 

2.主线程等待N个子线程都结束之后才继续做其它的事情。

 

 

classDriver{// ...

   voidmain()throwsInterruptedException{

     CountDownLatchstartSignal=newCountDownLatch(1);

     CountDownLatchdoneSignal=newCountDownLatch(N);

 

     for(inti=0;i<N;++i)// create and start threads

       newThread(newWorker(startSignal,doneSignal)).start();

 

     doSomethingInit();           // 做初始化工作

     startSignal.countDown();     // 让所有子线程运行

     doneSignal.await();         // 等待所有子线程结束 

 

doSomethingElse();             //做其它事情。

 

 

   }

 }

 

 classWorkerimplementsRunnable{

   privatefinalCountDownLatchstartSignal;

   privatefinalCountDownLatchdoneSignal;

   Worker(CountDownLatchstartSignal,CountDownLatchdoneSignal){

     this.startSignal=startSignal;

     this.doneSignal=doneSignal;

   }

   publicvoidrun(){

     try{

        startSignal.await();

        doWork();

        doneSignal.countDown();

     }catch(InterruptedExceptionex){}// return;

   }

 

   voiddoWork(){...}

 }

 

 

 

CountDownLatch类只有一个成员变量,就是一个整形值,是个计数器,而且成员函数也只有两个经常调用的函数。

1.countDown,让计数器减去

2.await。等待计数器为0,然后继续从await后面运行。

原理就是这样,我们来看代码。

 CountDownLatchstartSignal=newCountDownLatch(1);

 CountDownLatchdoneSignal=newCountDownLatch(N);

 for(inti=0;i<N;++i)// create and start threads

       newThread(newWorker(startSignal,doneSignal)).start();

这里主线程开启了N个线程,并调用了start函数,同时传入两个用于同步的CountDownLatch,我们看线程里面有

startSignal.await();

 doWork();

doneSignal.countDown();

什么意思呢?就是startSignal.await()让该线程等待,直到startSignal里面的计数器为0才开始运行,那他什么时候为0呢?我们在看到主线程有

 

 doSomethingInit();           // 做初始化工作

 startSignal.countDown();     // 让所有子线程运行

startSignal是在主线程做了doSomethingInit()这个函数之后,调用 startSignal.countDown()让startSignal的计数器减1,我们看startSignal的计数器初始值是多少,

CountDownLatchstartSignal=newCountDownLatch(1);

不错,是1,也就是,只要主线程一执行startSignal.countDown(),startSignal的计数就马上变成0,所有子线程就运行起来了,因为所有的子线程都在等startSignal它变成0。

 

当所有子线程都运行起来之后,我们来看现在主线才执行到哪儿了:

doneSignal.await();         // 等待所有子线程结束 

不错,主线程又在等在中,等待doneSignal的计数器变成0,我们再来看doneSignal的初始值是多少

 CountDownLatchdoneSignal=newCountDownLatch(N);

是N,也就是说要执行N次的doneSignal.countDown,主线程才能继续运行,我们来看doneSignal的计数器在那里减少的,看到子线程里面

 doWork();

doneSignal.countDown();

子线程在执行了doWork()之后,就会doneSignal.countDown();让doneSignal的计数器减1,一个子线程自会执行一次doneSignal.countDown();但是N个子线程就执行了N次doneSignal.countDown();所以当所有子线程都执行过doneSignal.countDown();之后,doneSignal的计数器就变成0了,然后主线程就可以继续运行了。

做其它的事情。

doSomethingElse();             //做其它事情。

分享到:
评论

相关推荐

    利用 CountDownLatch 类实现线程同步

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

    android多线程demo(很清晰很详细)

    - **CountDownLatch, CyclicBarrier, Semaphore**:线程同步工具类,用于控制线程的并发数量和同步。 7. **线程池**: - **ThreadPoolExecutor**:自定义线程池,可根据需求设置核心线程数、最大线程数、线程存活...

    Android 线程同步Demo

    在Android开发中,多线程是提升应用性能和...总之,理解并熟练运用线程同步技术对于Android开发者来说至关重要,不仅可以提高应用性能,还能有效避免因线程不安全而导致的异常和错误,从而提升应用的质量和用户体验。

    Android多线程操作

    三、线程同步与通信 - **synchronized关键字**:用于同步代码块或方法,防止多个线程同时访问同一资源,避免数据竞争。 - **wait()和notify()**:Object类提供的线程间通信方法,用于线程的等待和唤醒。 - **...

    Android多线程全新讲解.pdf

    而Lock、Condition和Semaphore提供了更细粒度的控制和更灵活的线程同步机制。 3. Java并发编程API使用:在提供的内容中,还有定时器Timer和TimerTask的使用,这允许我们创建定时任务。文档展示了如何使用Timer来...

    Android多线程下载实现方案

    3. **线程同步**:在下载过程中,需要对各个线程的数据进行合并,这通常通过`java.util.concurrent`包中的工具类来实现,如`CountDownLatch`或`CyclicBarrier`。 ### 二、Android多线程下载实现步骤 1. **创建下载...

    Android多线程下载Demo

    总之,Android多线程下载是提高用户体验的关键技术,开发者需要深入了解网络编程、多线程同步、文件操作以及Android系统的特性,才能有效地实现这一功能。在实际项目中,结合合适的库和自定义逻辑,可以构建出稳定、...

    android多线程管理

    线程同步与通信 **3.1 `synchronized`关键字** 用于保证多线程环境下的数据一致性,防止数据竞争。 **3.2 `wait()`, `notify()`, `notifyAll()`** 这些方法用于线程间的通信与协作,通常配合`synchronized`...

    Android多线程断点续传下载器

    6. **线程同步与通信**: 在多线程环境中,线程间的同步和通信至关重要,以避免数据冲突。可以使用`java.util.concurrent`包中的工具,如`CountDownLatch`、`Semaphore`或`CyclicBarrier`来协调线程执行。 7. **...

    Android多线程处理

    6. **线程同步和通信**: - `synchronized`关键字:用于保证多线程环境下的数据一致性。 - `wait()`, `notify()`, `notifyAll()`:用于线程间的协作,一个线程等待另一个线程的通知。 - `CountDownLatch`:用于多...

    Android开发(个人整理01) 线程Demo源码

    Android提供了synchronized关键字、Lock接口(如ReentrantLock)以及CountDownLatch、Semaphore等工具来实现线程同步和互斥,防止数据竞争。 9. **测试与调试** 测试线程相关代码时,可以使用Android的 StrictMode...

    关于android多线程的 使用

    #### 三、Android中的线程同步与通信 1. **同步机制**: - Android支持多种同步机制,如`wait()`/`notify()`、`CountDownLatch`、`Semaphore`等。 - 示例代码: ```java CountDownLatch latch = new ...

    android 线程详解 各种经典 完整代码

    三、线程同步与通信 1. Synchronized:用于保证线程安全,防止多线程环境下数据不一致。 2. Wait/Notify:Object类中的方法,用于线程间的协作,一个线程等待另一个线程的通知。 3. Semaphore/CountDownLatch/...

    android 线程暂停/恢复/退出demo

    在实际项目中,还应考虑线程同步、异常处理以及使用更高级的并发工具,如`ExecutorService`和`HandlerThread`,来提高代码的可维护性和性能。通过实践这个“android 线程暂停/恢复/退出demo”,开发者可以加深对...

    Android-Android多线程下载项目

    6. **线程同步与通信** 在多线程环境中,线程间的同步和通信至关重要。项目可能使用了`wait()`, `notify()`或者`CountDownLatch`等机制来确保线程间正确地协作,比如等待所有下载线程完成后再合并文件,或者在某个...

    Android 多线程下载

    在Android开发中,多线程下载是一项常见的任务...总结来说,Android多线程下载涉及到了Android线程模型、网络请求、文件I/O、同步机制、进度更新等多个核心知识点,通过合理的设计和实现,可以提升下载效率和用户体验。

    Android多线程断点下载源码

    4. **线程同步与管理**:多线程下载涉及线程间的协作,需要使用如Semaphore、CountDownLatch等同步机制,确保所有线程正确地开始和结束下载。 5. **下载进度监听**:提供实时的下载进度更新,可以使用...

    Android 多线程

    三、多线程同步与通信 1. Synchronized关键字:用于保证线程安全,防止数据竞争。 2. volatile关键字:确保共享变量在多线程环境下的可见性和有序性。 3. Java并发工具类:如Semaphore(信号量)、CyclicBarrier...

    初中级Android开发社招面试之线程.zip

    在Android中,可以使用synchronized关键字、wait()、notify()和notifyAll()方法,以及Java提供的Semaphore、CountDownLatch等并发工具类实现线程同步。 四、IntentService IntentService是一种单线程服务,用于执行...

Global site tag (gtag.js) - Google Analytics