在日常事务中,我们常常依次做如下操作: 排队取得一个单号; 根据这个单号享有一个操作; 为当前的这个操作买单.
在Android中也一样,为了不阻塞主线程,我们把所有耗时行为都封装为多个线程,有的时候需要先运行线程A,根据得到的结果再运行线程B, 再根据B的结果运行线程C. 时序图如下:
如果我们在ThreadA结束前的代码中插入ThreadB.start, 再ThreadB的结束前的代码中插入ThreadC.start. 那这样的代码很难读,从整体上看也像棉花糖一样无比壮大....
其实在android中有比较优雅的简单的方式处理这个。如下以两个Thread为例子展开演进:
conditionVariableForConnection = new ConditionVariable();
app.method01(param1, param2, new callback01() {
@Override
public void method4Callback01(Object result01) {
conditionVariableForRequestSession.open();
...
}
};
conditionVariableForRequestSession.block(SESSION_WAIT_TIME_MS);
if(getSession()) {
app.method02(param01,param02,callback02(){});
}
...
ExecutorService executorService = Executors.newSingleThreadExecutor();
Callable<String> callback01 = new Callable<String>() {
@Override
public String call() throws Exception {
return HttpHelper.getURLRequestHeadInfo("url01");
}
};
Future<String> future01 = executorService.submit(callback01);
Callable<String> callback02 = new Callable<String>() {
@Override
public String call() throws Exception {
return HttpHelper.getURLRequestHeadInfo("url02");
}
};
Future<String> future02 = executorService.submit(callback02);
if(HttpHelper.isSessionAvaiable(future01.get()) && HttpHelper.isSessionAvaiable(future02.get()) ) {
...
}
总结:
上述两种方式都是用同步的方式进行着异步的处理,代码的直观性和可移植性成倍增加
ConditionVariable方式主要用来协同多个开发员之间的接口或与老系统的交接。随着交互接口的增多需要多次使用ConditionVariable,但是他的可读性比我们棉花糖式的代码有了直接改观;
ExecutorService方式在上下文数据交互(根据前一线程结果来运行新的线程)方面很优雅,整体效率也更高点
- 大小: 7.6 KB
分享到:
相关推荐
标题中的“支持多线程和泛型的阻塞队列”意味着我们讨论的是一个能够同时处理多个线程并能存储不同类型数据的队列实现。 ### 阻塞队列的基本概念 阻塞队列(Blocking Queue)是线程安全的数据结构,它结合了队列的...
Java中的阻塞队列是一种基于同步原语的高级数据结构,它在多线程编程中扮演着重要角色,尤其在并发处理和优化系统资源利用率方面。阻塞队列结合了队列的数据结构与线程同步机制,使得生产者可以在队列满时被阻塞,而...
阻塞队列为线程间通信提供了便捷的机制,可以用来协调多个线程的运行,防止多线程直接访问共享资源导致的并发问题。例如,生产者-消费者问题就可以通过阻塞队列来优雅地解决。生产者在队列满时会被阻塞,直到队列有...
在Java编程语言中,阻塞队列是一种线程安全的数据结构,它在多线程并发控制中发挥着重要作用。阻塞队列的核心特性是当队列为空时,尝试获取元素的线程会被阻塞,直到其他线程添加元素;同样,当队列满时,试图插入...
生产者线程(如用户发送消息的线程)将消息放入阻塞队列,而消费者线程(如处理和分发消息的线程)从队列中取出消息。通过这种方式,生产者和消费者可以异步工作,提高系统吞吐量。 登录机制是聊天室的重要组成部分...
### BlockingQueue(阻塞队列)详解 #### 一、前言 随着现代软件系统对并发性能需求的不断提高,多线程编程技术逐渐成为开发人员不可或缺的技能之一。在Java平台中,`java.util.concurrent`包提供了丰富的工具来...
在Java编程中,"并发-线程池和阻塞队列"是两个核心概念,它们在多线程环境下处理任务调度和数据同步方面发挥着重要作用。线程池是一种管理线程资源的有效方式,而阻塞队列则常用于线程间通信和数据共享。 线程池...
线程消息队列是并发编程中一种常见的同步和通信机制,尤其在多线程环境和异步处理中扮演着重要角色。它通过提供一个数据结构,即消息队列,来协调多个生产者线程和一个或多个消费者线程之间的交互。这种设计模式允许...
2. **阻塞队列**:利用`BlockingQueue`接口实现的队列,如`ArrayBlockingQueue`、`LinkedBlockingQueue`等,可以确保当队列满时,新添加的任务会阻塞等待,直到有空闲空间为止;同样,当队列为空时,从队列中取出...
在这样的系统中,一个或多个生产者线程负责将任务(通常是函数调用或者数据处理任务)放入队列,而消费者线程则从队列中取出任务并执行。这种设计可以有效地提高系统的并行处理能力,特别是在多核处理器环境中,能...
2. **阻塞队列**:一种常见的队列实现是阻塞队列,当队列为空时,尝试取元素的线程会被阻塞,直到有新的元素加入;同样,当队列满时,试图插入元素的线程也会被阻塞。这样可以防止资源浪费,线程可以根据队列的状态...
同时,作为阻塞队列,当生产者尝试向满队列添加元素时,或者消费者尝试从空队列中获取元素时,线程会被阻塞,直到队列有可用空间或数据,这大大简化了多线程同步的问题。 在生产者/消费者模式中,生产者通常通过`...
5. **并发任务处理**:多个工作线程可以从队列中取出任务进行处理,使用阻塞队列可以避免多个线程同时处理同一个任务的问题。 #### 二、阻塞队列的接口方法 阻塞队列的接口方法大致可以分为三类: 1. **抛出异常*...
在日志队列处理中,通常会采用优先级调度,让紧急或重要的日志优先处理。 5. **生产者与消费者模型**:这是一种经典的并发设计模式,其中生产者负责生成数据放入队列,而消费者则负责从队列中取出并处理数据。在多...
- **缓冲区**:在I/O操作中,可以使用阻塞队列作为缓冲区,生产者读取数据后放入队列,消费者从队列中取出数据进行处理。 - **信号量管理**:在并发控制中,可以用阻塞队列限制并发访问的数量。 ### 4. 实战案例 - ...
线程池中的工作线程会从队列中取出任务执行,当任务量超过线程池处理能力时,多出的任务会被暂存在线程池维护的阻塞队列中。 - 生产者消费者模式:这是并发编程中的一个经典模式。生产者负责产生数据并存入阻塞队列...
在C#中,工作队列通常用于将耗时的任务放入队列,然后由一组后台线程来处理这些任务,而不是在主线程中直接执行。这样可以避免阻塞UI线程,提高用户体验。 在"C#实现的工作队列,workquere,多线程管理"项目中,...
本文主要探讨了如何在C#中实现非阻塞的异步方法调用,以避免线程阻塞,从而提高程序效率。 首先,我们需要理解同步与异步调用的区别。同步方法调用是传统的调用方式,当一个线程调用一个函数,如`Foo()`,它会等待...
由于阻塞队列能自动处理线程间的同步,因此可以简化代码并提高系统的可伸缩性。此外,阻塞队列还广泛应用于任务调度、线程池(如`ThreadPoolExecutor`)等场景,是并发编程中不可或缺的一部分。 总结来说,Java阻塞...
本篇将详细讲解如何在C#中构建一个生产消费者队列,以及它如何帮助优化线程处理。 首先,理解生产者消费者模型的基本概念:生产者负责生成数据并放入队列,而消费者则从队列中取出数据进行处理。这种模型使得生产者...