- 浏览: 599106 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (669)
- oracle (36)
- java (98)
- spring (48)
- UML (2)
- hibernate (10)
- tomcat (7)
- 高性能 (11)
- mysql (25)
- sql (19)
- web (42)
- 数据库设计 (4)
- Nio (6)
- Netty (8)
- Excel (3)
- File (4)
- AOP (1)
- Jetty (1)
- Log4J (4)
- 链表 (1)
- Spring Junit4 (3)
- Autowired Resource (0)
- Jackson (1)
- Javascript (58)
- Spring Cache (2)
- Spring - CXF (2)
- Spring Inject (2)
- 汉字拼音 (3)
- 代理模式 (3)
- Spring事务 (4)
- ActiveMQ (6)
- XML (3)
- Cglib (2)
- Activiti (15)
- 附件问题 (1)
- javaMail (1)
- Thread (19)
- 算法 (6)
- 正则表达式 (3)
- 国际化 (2)
- Json (3)
- EJB (3)
- Struts2 (1)
- Maven (7)
- Mybatis (7)
- Redis (8)
- DWR (1)
- Lucene (2)
- Linux (73)
- 杂谈 (2)
- CSS (13)
- Linux服务篇 (3)
- Kettle (9)
- android (81)
- protocol (2)
- EasyUI (6)
- nginx (2)
- zookeeper (6)
- Hadoop (41)
- cache (7)
- shiro (3)
- HBase (12)
- Hive (8)
- Spark (15)
- Scala (16)
- YARN (3)
- Kafka (5)
- Sqoop (2)
- Pig (3)
- Vue (6)
- sprint boot (19)
- dubbo (2)
- mongodb (2)
最新评论
java Future具有局限性。在实际应用中,当需要下载大量图片或视频时,可以使用多线程去下载,提交任务下载后,可以从多个Future中获取下载结果,由于Future获取任务结果是阻塞的,所以将会依次调用Future.get()方法,这样的效率会很低。很可能第一个下载速度很慢,则会拖累整个下载速度。
Future主要功能在于获取任务执行结果和对异步任务的控制。但如果要获取批量任务的执行结果,从上面的例子我们已经可以看到,单使用 Future 是很不方便的。其主要原因在于:一方面是没有好的方法去判断第一个完成的任务;另一方面是 Future的get方法 是阻塞的,使用不当会造成线程的浪费。第一个问题可以用 CompletionService 解决,CompletionService 提供了一个 take() 阻塞方法,用以依次获取所有已完成的任务。第二个问题可以用 Google Guava 库所提供的 ListeningExecutorService 和 ListenableFuture 来解决。除了获取批量任务执行结果时不便,Future另外一个不能做的事便是防止任务的重复提交。要做到这件事就需要 Future 最常见的一个实现类 FutureTask 了。Future只实现了异步,而没有实现回调,主线程get时会阻塞,可以轮询以便获取异步调用是否完成。
在实际的使用中建议使用Guava ListenableFuture来实现异步非阻塞,目的就是多任务异步执行,通过回调的方方式来获取执行结果而不需轮询任务状态。
Future主要功能在于获取任务执行结果和对异步任务的控制。但如果要获取批量任务的执行结果,从上面的例子我们已经可以看到,单使用 Future 是很不方便的。其主要原因在于:一方面是没有好的方法去判断第一个完成的任务;另一方面是 Future的get方法 是阻塞的,使用不当会造成线程的浪费。第一个问题可以用 CompletionService 解决,CompletionService 提供了一个 take() 阻塞方法,用以依次获取所有已完成的任务。第二个问题可以用 Google Guava 库所提供的 ListeningExecutorService 和 ListenableFuture 来解决。除了获取批量任务执行结果时不便,Future另外一个不能做的事便是防止任务的重复提交。要做到这件事就需要 Future 最常见的一个实现类 FutureTask 了。Future只实现了异步,而没有实现回调,主线程get时会阻塞,可以轮询以便获取异步调用是否完成。
在实际的使用中建议使用Guava ListenableFuture来实现异步非阻塞,目的就是多任务异步执行,通过回调的方方式来获取执行结果而不需轮询任务状态。
import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.Executors; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.MoreExecutors; public class ListenableTest { public static void main(String[] args) { ListeningExecutorService executorService = MoreExecutors.listeningDecorator(Executors.newCachedThreadPool()); final List<Long> value = new ArrayList<Long>(); List<ListenableFuture<Long>> futures = new ArrayList<ListenableFuture<Long>>(); for(long i=1;i<=3;i++){ // 处理线程逻辑 final ListenableFuture<Long> listenableFuture = executorService.submit(new AddCallable(1000000*(i-1)+1,i*1000000)); // 回调方法 Futures.addCallback(listenableFuture, new FutureCallback<Long>() { @Override public void onSuccess(Long result) { value.add(result); } @Override public void onFailure(Throwable t) { t.printStackTrace(); } }); futures.add(listenableFuture); } // 阻塞三个线程执行完成 Futures.allAsList(futures); long result = 0 ; for(int i=0,n=value.size();i<n;i++){ result += value.get(i); } System.out.println("sum:"+result); executorService.shutdownNow(); } } /** * 累加线程 * @author * @time */ class AddCallable implements Callable<Long>{ private long begin ; private long end ; public AddCallable(long begin,long end){ this.begin = begin ; this.end = end ; } @Override public Long call() throws Exception { long result = 0; for(long i=begin;i<=end;i++){ result += i; } return result ; } }
发表评论
文章已被作者锁定,不允许评论。
-
java WeakHashMap学习(key是弱引用)
2018-06-21 09:31 1232在Java集合中有一种特殊的Map类型:WeakHashMap ... -
java HashMap TreeMap(key顺序) LinkedHashMap(插入顺序)学习
2018-06-07 10:27 950java为数据结构中的映射定义了一个接口java.util.M ... -
java RESTful 详解
2018-04-27 11:35 642(1)每一个URI代表一种资源,独一无二; (2)客户端 ... -
java 通过HttpsUrlConnection访问接口数据
2018-04-19 11:25 987server: ssl: key-stor ... -
java 使用多线程的场景总结
2018-04-10 14:35 1703在一个高并发的网站中,多线程是必不可少的。下面先说一下多线程在 ... -
java Enum枚举设置
2018-04-10 10:55 479/** * 数据状态:0:无效,1:有效 **/ ... -
java RestTemplate访问restful服务
2018-03-01 15:02 1621REST的基础知识 当谈论REST时,有一种常见的错误就是将其 ... -
java FYOpenApi实现短信发送
2018-01-02 17:10 11731.配置文件 sms.OpenUrl = http://s ... -
java JSONObject序列化包含Date类型数据的Java对象
2017-12-26 16:31 1617如果Date.class无法进行转换则使用Timestamp. ... -
java 用HttpsURLConnection进行传递中文时错误总结
2017-12-07 16:42 654传递中文时需要用Writer而不是OutputStream ... -
java 内存泄漏
2017-11-27 13:51 4941.内存溢出 out of memory ... -
ActiveMQ 三种发送消息方式(同步,异步,单向)
2017-11-17 10:25 2453MQ 发送普通消息有三种实现方式:可靠同步发送、可靠异步发送、 ... -
java Curator实现分布式锁
2017-09-05 14:39 1090Curator实现分布式锁主要依赖于zookeeper ... -
java Guava工具集学习(强大)
2017-09-05 10:28 432import java.util.Iterator ... -
java CyclicBarrier进行并发编程
2017-08-25 15:44 672CyclicBarrier允许一组线程相互等待达到一个公共的障 ... -
java 几种性能优化的总结
2017-08-23 14:08 3241、使用StringBuilder 一般 ... -
java 使用kyro进行高性能序列化对象和集合
2017-08-23 14:05 2151import java.io.ByteArrayInp ... -
java 对重复电话号码进行排除的优化(排序和前后对比)
2017-08-22 14:14 7901.先对10万数据排序; 2.对比前后两条数据 ; 3.筛 ... -
ActiveMQ 结合Spring进行数据同步
2017-07-19 15:27 583注意事项hibernate配置文件必须设置自动提交否则不能插入 ... -
java 通过反射原理进行复制操作
2017-07-10 14:24 508// 这些实例的对象字段[sCode] String ...
相关推荐
ListenableFuture允许异步操作完成后执行回调,Service接口简化了服务的启动和停止流程,ExecutorService则提供了一种管理线程池的方式。 三、函数式编程 Guava对函数式编程的支持体现在 Predicates、Functions 和...
10. **异步计算**:ListenableFuture接口扩展了Java的Future,增加了注册回调的能力,使得异步结果处理更加灵活。 Guava的学习笔记.docx文件可能包含了对以上概念的详细解释和示例代码,而未命名的压缩包子文件可能...
ListenableFuture允许在异步操作完成后执行回调,Service接口简化了服务的启动、停止管理,而Executor服务则方便了线程池的创建和管理。 四、字符串处理 Guava提供了更高效、更简洁的字符串处理工具,如Strings类...
4. **并发支持**:Guava提供了强大的并发工具,如ListenableFuture(可监听的未来,允许异步操作的回调)、CountDownLatch(计数门限锁,用于同步多个线程)和ExecutorService(执行服务,管理线程池)。这些工具...
例如,ListenableFuture接口允许添加回调函数,当异步操作完成时会自动触发。 4. 字符串处理:Guava包含了一些方便的字符串处理方法,如Joiner和Splitter,它们可以更方便地进行字符串的连接和分割操作。此外,...
- **`ListenableFuture`**:扩展了标准Java中的`Future`接口,提供了更丰富的回调机制。 - **`RateLimiter`**:用于限制执行速度,避免资源过度消耗。 ##### 4. 字符串处理 - **`Joiner`**:将集合或数组转换为...
ListenableFuture允许注册回调函数,当未来结果可用时会自动执行。Service接口用于管理服务的生命周期,包括启动、停止和服务状态的检查。CountDownLatch则是一种同步辅助类,用于协调多个线程的执行。 四、I/O操作...
ListenableFuture接口允许添加回调函数,当异步任务完成时自动执行。Futures类则提供了一系列方法,用于组合、转换和管理Future对象。 Guava对原生类型的支持,如Ints、Longs和Booleans,提供了更方便的操作方法,...
ListenableFuture(可监听的Future): Futures,用于异步完成的回调。 2. Service: 控制事件的启动和关闭,为你管理复杂的状态逻辑。 六. Strings: 一个非常非常有用的字符串工具类: 提供 splitting,joining,...
- `ListenableFuture`:异步操作完成后回调的接口,增强了 Future 的能力。 - `Service`:简化服务的启动、停止和状态管理。 7. **Strings** - 提供了丰富的字符串处理工具,如拆分、连接、填充等。 8. **...
例如,`com.google.common.util.concurrent`包下提供了线程安全的`ListenableFuture`,它扩展了`Future`接口,允许添加完成时的回调,增强了异步编程的能力。此外,Guava的`LoadingCache`是缓存的实现,它支持自动...
Guava提供了许多并发工具,如ListenableFuture(可监听的未来结果,允许在异步任务完成时执行回调)、Service(服务管理接口,用于启动、停止和监控服务)和ExecutorService(执行器服务,管理线程池)。这些工具...
Guava 的 `ListenableFuture` 更是在回调机制上提供了便利,使得我们可以根据任务完成情况触发其他逻辑。而 Scala 的 Futures 和 Promises 结合 Actor 模型,能构建出高度响应式的系统。 总之,无论是 Java、Guava ...
如果你有一个`ListenableFuture`实例,你可以注册回调函数,当未来任务完成(成功、失败或被取消)时,这些回调函数会被触发。这种设计模式使得代码更加异步友好,可以实现非阻塞式的事件处理,提高了程序的响应速度...
Guava是Google开发的一个核心库,它为Java开发人员提供了许多强大的工具和功能。这个库包含了许多实用类、集合、缓存、并发工具、原始类型支持、字符串处理、I/O等,极大地丰富了Java的标准库。Guava的目标是提高...