写了很简单的例子,用来测试 https://github.com/OpenTSDB/async
通过例子,可以看出Deferred的使用方式,执行顺序,理解了这个例子,基本上就明白了Deferred的工作机制。
Maven依赖:
<dependency> <groupId>com.stumbleupon</groupId> <artifactId>async</artifactId> <version>1.4.1</version> </dependency>
Java代码:
import com.stumbleupon.async.Deferred; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import static java.lang.System.out; public class TestDeferred { public static void main(String[] args) throws InterruptedException { out.println(Thread.currentThread().getName()); Deferred<String> deferred = new Deferred<>().addBoth(str -> { out.println(Thread.currentThread().getName() + " 1 " + str.toString()); return str; }).addBothDeferring(str -> { out.println(Thread.currentThread().getName() + " 2 " + str); Deferred<String> d = new Deferred<>().addBoth(s -> { out.println(Thread.currentThread().getName() + " 3 " + s.toString()); return s.toString(); }); Executors.newSingleThreadExecutor().execute(() -> { out.println(Thread.currentThread().getName() + " started."); d.callback("hello"); }); return d; }).addBoth(str -> { out.println(Thread.currentThread().getName() + " 4 " + str.toString()); return str; }).addErrback(str -> { out.println(str.toString()); return str; }); Executors.newSingleThreadExecutor().execute(() -> { out.println(Thread.currentThread().getName() + " started."); // deferred.callback("hello"); deferred.callback(new NullPointerException("error.")); }); out.println(Thread.currentThread().getName() + " sleeping..."); TimeUnit.MINUTES.sleep(1); } }
输入:
main main sleeping... pool-1-thread-1 started. pool-1-thread-1 1 java.lang.NullPointerException: error. pool-1-thread-1 2 java.lang.NullPointerException: error. pool-2-thread-1 started. pool-2-thread-1 3 hello pool-2-thread-1 4 hello