您的位置 首页 java

java异步并发执行实现方法,如上传多文件等待全部结束再返回

在项目开发中会遇到异步并发的情况,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;

}

文章来源:智云一二三科技

文章标题:java异步并发执行实现方法,如上传多文件等待全部结束再返回

文章地址:https://www.zhihuclub.com/188315.shtml

关于作者: 智云科技

热门文章

发表回复

您的电子邮箱地址不会被公开。

网站地图