在项目开发中会遇到异步并发的情况,javascript解决方法可用promise等。 java 也有自己的解决方
同步并发,当多个同步代码任务要同时执行又要等待全部结束之后再返回结果,这种方式我称之为同步并发,解决方法就是利用Callable和 future Task, 代码如下
在上面的方法中用到了Future和Futuretask,待执行的任务如下
public class TaskWithResult implements Callable<Integer> {
private Integer id;
public TaskWithResult(Integer id) {
this.id = id;
}
@ Override
public Integercall() throws Exception{
//重写call方法立即执行,返回结果,在call方法里用到的是同步执行
Thread.sleep(5000);
return (id+” stoped”);
}
}
异步并发,所谓异步并发是指,在call方法里执行的是异步方法,而call又不能直接异步返回,这就要引入今天的主角promise了,什么promise不是javascript里的吗?不是的,java也又得,jdeferred,github地址 。
call方法里执行代码示例如下:
@Override
public DeferredObject call() throws Exception{
DeferredObject deferred = new DeferredObject();
Promise promise = deferred.promise();
promise.done(new DoneCallback() {
public void onDone(Object result) {
try {
Thread.sleep(5000);
objs[id]=”200″ + id;//保存执行结果 或者
resolve(“200″+id)
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}). fail (new FailCallback() {
public void onFail(Object rejection) {
}
});
return (DeferredObject) deferred.resolve(200);
}
异步并发还有一种方法就是全部都用promise,不用callback,也不用Future,这个github里有代码示例我就不打出来了,用到的是promise.when()方法,这样多个图片上传,多个异步同时执行再也不怕了,节省了大量时间,就是系统开销大一点。
DeferredObject[] objs = new DeferredObject[11];
for (int i = 0; i < 5; i++) {
objs[i] = test(i);
}
PrintWriter out = response.getWriter();
DeferredManager dm = new DefaultDeferredManager();
dm.when(objs[0],objs[1],objs[2],objs[3],objs[4])
.then(new DoneCallback() {
public void onDone(Object result) {
System.out.println(“result here ” + result);
System.out.println(“result here 2 ” + result);
out.println(“there”);
}
}).fail(new FailCallback() {
public void onFail(Object result) {
}
});
public DeferredObject test(int i) {
DeferredObject deferred = new DeferredObject();
Promise promise = deferred.promise();
try {
AVFile file = AVFile.withAbsoluteLocalPath(“LeanCloud. png “, “D:/home.png”);
file.saveInBackground(new SaveCallback() {
@Override
public void done(AVException e) {
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
deferred.resolve(“here ” + i);
}
});
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
return deferred;
}