84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
一个返回值为User的方法,在内部调用了异步方法(比如Rxjava,或者异步的网络请求),其内部匿名函数内才能拿到user对象,那么我的方法应该怎么return这个对象?
学习是最好的投资!
方法的返回值为user,那这个方法就不能叫异步方法了。除非这个方法返回future,或者类似于可以在之后拿到结果的引用,这个方法才能叫异步方法。想调完方法后得到user,那么方法里面就没有必要再放置异步的代码了,一点意义都没有。
异步的返回结果只能通过回调。
同步的方法通常是这样的
public User syncGetUser() { User user = heavyWork(); return user; }
由于heavyWork方法可能需要查数据库,或者做大量计算,所以heavyWork方法会执行大量的时间。如果你不想等待大量的时间,这时候异步就可以派上用场了。
public Future<User> asyncGetUser() { Future<User> future = threadPool.submit(new Callable<User> { public User call() throws Exception { return heavyWork(); } } return future; }
到了这里,heavyWork已经交给另外一个线程去跑了,并返回一个future给你。之后,你可以通过这个future的get方法得到你想要的user。
这才是异步的意义和用处所在。题主的题目本身就是矛盾的。在一个含有异步代码的方法里面返回异步执行的结果,是个矛盾的事情。
我没有研究过 RxJava,不过之前团队里面做 Android 的开发的同事说是很好用。
1 楼给了一种使用 Future 的方案,但是很抱歉 Future 是一种异步阻塞式的API,即没有通知回调。
至于回调怎么实现,这个应该很基本,去看看观察者模式就好了,本质还是利用接口的多态特性。
不过可以使用 google guava,里面提供了一种增强的 Future 为 ListenableFuture。
这里引用 1 楼的例子,进行修改。
class A implements FutureCallback{ ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10)); ListenableFuture futrue = service.submit(new Callable() { public User call() { return heavyWork(); } }); Futures.addCallback(furtrue,this); public void onSuccess(User user) { //这个是回调执行的代码 } public void onFailure(Throwable thrown) { } }
异步方法的“返回”在执行代码之前。代码都还没执行,怎么返回结果?
我觉得使用回调方式也可以
使用CountDownLatch 可以将异步操作,转换为同步操作。
final CountDownLatch latch = new CountDownLatch(1);
调用异步方法。在异步回调结果中,latch.countDown();
然后try {
latch.await();
} catch (InterruptedException e) { }
return 数据;
java里有线程返回Callable接口
rx.java并没有接触过但是我知道android里的方法,希望对你有帮助。根据你所说,异步的返回结果用于主方法 那么就要考虑到线程间的通信即先写一个handler , 并写一个接收数据的方法 ,当数据过来时执行想要执行的方法然后子线程运行完成之后给handler发送数据 即可。
方法的返回值为user,那这个方法就不能叫异步方法了。除非这个方法返回future,或者类似于可以在之后拿到结果的引用,这个方法才能叫异步方法。想调完方法后得到user,那么方法里面就没有必要再放置异步的代码了,一点意义都没有。
异步的返回结果只能通过回调。
同步的方法通常是这样的
由于heavyWork方法可能需要查数据库,或者做大量计算,所以heavyWork方法会执行大量的时间。
如果你不想等待大量的时间,这时候异步就可以派上用场了。
到了这里,heavyWork已经交给另外一个线程去跑了,并返回一个future给你。
之后,你可以通过这个future的get方法得到你想要的user。
这才是异步的意义和用处所在。题主的题目本身就是矛盾的。在一个含有异步代码的方法里面返回异步执行的结果,是个矛盾的事情。
我没有研究过 RxJava,不过之前团队里面做 Android 的开发的同事说是很好用。
1 楼给了一种使用 Future 的方案,但是很抱歉 Future 是一种异步阻塞式的API,即没有通知回调。
至于回调怎么实现,这个应该很基本,去看看观察者模式就好了,本质还是利用接口的多态特性。
不过可以使用 google guava,里面提供了一种增强的 Future 为 ListenableFuture。
这里引用 1 楼的例子,进行修改。
异步方法的“返回”在执行代码之前。代码都还没执行,怎么返回结果?
我觉得使用回调方式也可以
使用CountDownLatch 可以将异步操作,转换为同步操作。
final CountDownLatch latch = new CountDownLatch(1);
调用异步方法。
在异步回调结果中,
latch.countDown();
然后
try {
} catch (InterruptedException e) {
}
return 数据;
java里有线程返回Callable接口
rx.java并没有接触过
但是我知道android里的方法,希望对你有帮助。
根据你所说,异步的返回结果用于主方法 那么就要考虑到线程间的通信
即先写一个handler , 并写一个接收数据的方法 ,当数据过来时执行想要执行的方法
然后子线程运行完成之后给handler发送数据 即可。