推荐安卓开发神器(里面有各种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(); //做其它事情。 |
相关推荐
Java 提供了多种工具来实现这样的同步机制,其中之一便是 `CountDownLatch` 类。`CountDownLatch` 是一个计数器,可以用于协调多个线程间的活动,等待所有线程完成各自的任务后,主线程或其他线程才能继续执行。 ...
- **CountDownLatch, CyclicBarrier, Semaphore**:线程同步工具类,用于控制线程的并发数量和同步。 7. **线程池**: - **ThreadPoolExecutor**:自定义线程池,可根据需求设置核心线程数、最大线程数、线程存活...
在Android开发中,多线程是提升应用性能和...总之,理解并熟练运用线程同步技术对于Android开发者来说至关重要,不仅可以提高应用性能,还能有效避免因线程不安全而导致的异常和错误,从而提升应用的质量和用户体验。
三、线程同步与通信 - **synchronized关键字**:用于同步代码块或方法,防止多个线程同时访问同一资源,避免数据竞争。 - **wait()和notify()**:Object类提供的线程间通信方法,用于线程的等待和唤醒。 - **...
而Lock、Condition和Semaphore提供了更细粒度的控制和更灵活的线程同步机制。 3. Java并发编程API使用:在提供的内容中,还有定时器Timer和TimerTask的使用,这允许我们创建定时任务。文档展示了如何使用Timer来...
3. **线程同步**:在下载过程中,需要对各个线程的数据进行合并,这通常通过`java.util.concurrent`包中的工具类来实现,如`CountDownLatch`或`CyclicBarrier`。 ### 二、Android多线程下载实现步骤 1. **创建下载...
总之,Android多线程下载是提高用户体验的关键技术,开发者需要深入了解网络编程、多线程同步、文件操作以及Android系统的特性,才能有效地实现这一功能。在实际项目中,结合合适的库和自定义逻辑,可以构建出稳定、...
线程同步与通信 **3.1 `synchronized`关键字** 用于保证多线程环境下的数据一致性,防止数据竞争。 **3.2 `wait()`, `notify()`, `notifyAll()`** 这些方法用于线程间的通信与协作,通常配合`synchronized`...
6. **线程同步与通信**: 在多线程环境中,线程间的同步和通信至关重要,以避免数据冲突。可以使用`java.util.concurrent`包中的工具,如`CountDownLatch`、`Semaphore`或`CyclicBarrier`来协调线程执行。 7. **...
6. **线程同步和通信**: - `synchronized`关键字:用于保证多线程环境下的数据一致性。 - `wait()`, `notify()`, `notifyAll()`:用于线程间的协作,一个线程等待另一个线程的通知。 - `CountDownLatch`:用于多...
Android提供了synchronized关键字、Lock接口(如ReentrantLock)以及CountDownLatch、Semaphore等工具来实现线程同步和互斥,防止数据竞争。 9. **测试与调试** 测试线程相关代码时,可以使用Android的 StrictMode...
#### 三、Android中的线程同步与通信 1. **同步机制**: - Android支持多种同步机制,如`wait()`/`notify()`、`CountDownLatch`、`Semaphore`等。 - 示例代码: ```java CountDownLatch latch = new ...
三、线程同步与通信 1. Synchronized:用于保证线程安全,防止多线程环境下数据不一致。 2. Wait/Notify:Object类中的方法,用于线程间的协作,一个线程等待另一个线程的通知。 3. Semaphore/CountDownLatch/...
在实际项目中,还应考虑线程同步、异常处理以及使用更高级的并发工具,如`ExecutorService`和`HandlerThread`,来提高代码的可维护性和性能。通过实践这个“android 线程暂停/恢复/退出demo”,开发者可以加深对...
6. **线程同步与通信** 在多线程环境中,线程间的同步和通信至关重要。项目可能使用了`wait()`, `notify()`或者`CountDownLatch`等机制来确保线程间正确地协作,比如等待所有下载线程完成后再合并文件,或者在某个...
在Android开发中,多线程下载是一项常见的任务...总结来说,Android多线程下载涉及到了Android线程模型、网络请求、文件I/O、同步机制、进度更新等多个核心知识点,通过合理的设计和实现,可以提升下载效率和用户体验。
4. **线程同步与管理**:多线程下载涉及线程间的协作,需要使用如Semaphore、CountDownLatch等同步机制,确保所有线程正确地开始和结束下载。 5. **下载进度监听**:提供实时的下载进度更新,可以使用...
三、多线程同步与通信 1. Synchronized关键字:用于保证线程安全,防止数据竞争。 2. volatile关键字:确保共享变量在多线程环境下的可见性和有序性。 3. Java并发工具类:如Semaphore(信号量)、CyclicBarrier...
在Android中,可以使用synchronized关键字、wait()、notify()和notifyAll()方法,以及Java提供的Semaphore、CountDownLatch等并发工具类实现线程同步。 四、IntentService IntentService是一种单线程服务,用于执行...