<commit_before>---
layout: post
title: 为Future添加监听事件
date: 2015-3-20
categories: java
tags: [java,concurrent,并发,回调]
description: 为Future增加回调方法避免手工代码轮询
---

在Java并发工具包`java.util.concurrent`中，高级的工具分成三类：`Executor Framework` 、并发集合`Concurrent Collection`以及同步器`Synchronizer`。其中的`Executor Framework` 通过控制`Thread`的启动，执行和关闭，简化了线程管理。内建对异步并发管理，允许线程异步返回。典型的`Executor`使用方法如下

````java
ExecutorService service = Executors.newCachedThreadPool();
Future<String> future = service.submit(new Callable<String>() {
		public String call() throws Exception {
		  return "SUCCESS";
		}
	});
String v = future.get();
System.out.println(v);
service.shutdown();
````

- 创建线程池
- 提交执行任务(`Runnable`,或者为`Callable`)
- 调用`Future`的`get`方法，获得返回结果

线程并发的目的，主要在于提高CPU的利用率，从而提高程序性能。在我们创建和提交线程之后，经常需要在线程执行完毕之后进行一些回调操作，`Executor Framework`也提供了相应的处理机制。调用`sumbit`方法之后，会立即返回的`Future`表示异步计算的结果，使用`future.get()`会堵塞线程直到线程执行完毕将对应的结果返回(暂不考虑异常处理)。

如果同事提交多个线程，并希望在每个线程线程执行完成之后立即能够执行对应的回调操作，就需要实时监控`future.get()`，最初的设想采用轮询操作,通过对Future进行实时遍历来处理回调，代码如下：

````java
public static void main(String[] args) {
  ExecutorService service = Executors.newCachedThreadPool();
  List<Future<String>> futures = new ArrayList<Future<String>>();
  for (int i = 0; i < 5; i++) {
    final int index  = i;
    Future<String> future = service.submit(new Callable<String>() {
      public String call() throws Exception {
        //执行线程休眠操作
        if( index%2 == 0) {
          TimeUnit.SECONDS.sleep(5);
        }<commit_msg>add duoshuo support<commit_after>---
layout: post
title: 为Future添加监听事件
date: 2015-3-20
categories: java
tags: [java,concurrent,并发,回调]
description: 为Future增加回调方法避免手工代码轮询
---

在Java并发工具包`java.util.concurrent`中，高级的工具分成三类：`Executor Framework` 、并发集合`Concurrent Collection`以及同步器`Synchronizer`。其中的`Executor Framework` 通过控制`Thread`的启动，执行和关闭，简化了线程管理。内建对异步并发管理，允许线程异步返回。典型的`Executor`使用方法如下

````java
ExecutorService service = Executors.newCachedThreadPool();
Future<String> future = service.submit(new Callable<String>() {
		public String call() throws Exception {
		  return "SUCCESS";
		}
	});
String v = future.get();
System.out.println(v);
service.shutdown();
````

>- 创建线程池
>- 提交执行任务(`Runnable`,或者为`Callable`)
>- 调用`Future`的`get`方法，获得返回结果

线程并发的目的，主要在于提高CPU的利用率，从而提高程序性能。在我们创建和提交线程之后，经常需要在线程执行完毕之后进行一些回调操作，`Executor Framework`也提供了相应的处理机制。调用`sumbit`方法之后，会立即返回的`Future`表示异步计算的结果，使用`future.get()`会堵塞线程直到线程执行完毕将对应的结果返回(暂不考虑异常处理)。

如果同事提交多个线程，并希望在每个线程线程执行完成之后立即能够执行对应的回调操作，就需要实时监控`future.get()`，最初的设想采用轮询操作,通过对Future进行实时遍历来处理回调，代码如下：

````java
public static void main(String[] args) {
  ExecutorService service = Executors.newCachedThreadPool();
  List<Future<String>> futures = new ArrayList<Future<String>>();
  for (int i = 0; i < 5; i++) {
    final int index  = i;
    Future<String> future = service.submit(new Callable<String>() {
      public String call() throws Exception {
        //执行线程休眠操作
        if( index%2 == 0) {
          TimeUnit.SECONDS.sleep(5);
        }
{'fraction_non_alphanumeric': 0.14188034188034188, 'fraction_numerical': 0.008205128205128205, 'mean_word_length': 6.119221411192214, 'pattern_counts': {'":': 0, '<': 21, '<?xml version=': 0, '>': 22, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3851284', 'n_tokens_mistral': 1466, 'n_tokens_neox': 1569, 'n_words': 168}