什么使异步单线程java代码异步
因此,我们目前正在用java开发一个应用程序,一位同事向我介绍了异步编程,无论我对它做了多少研究,对我来说,它似乎是同步的。 因此,异步代码的主要优点似乎是不冻结UI,而某些操作需要很长时间才能执行并返回结果,我们需要做的就是为该函数提供一个回调函数,该函数将在作业完成时调用。根据我从在线资源和stackoverflow的类似问题中了解到的情况,代码可以是单线程和异步的,甚至有人这样画: 异步(一个线程)(学分:): 那么,当被阻塞的部分被解除阻塞时,魔法会发生在哪里呢?方法1和其他方法的执行是同时进行的吗 我的理解是,不知何故会发生以下情况:什么使异步单线程java代码异步,java,asynchronous,single-threaded,Java,Asynchronous,Single Threaded,因此,我们目前正在用java开发一个应用程序,一位同事向我介绍了异步编程,无论我对它做了多少研究,对我来说,它似乎是同步的。 因此,异步代码的主要优点似乎是不冻结UI,而某些操作需要很长时间才能执行并返回结果,我们需要做的就是为该函数提供一个回调函数,该函数将在作业完成时调用。根据我从在线资源和stackoverflow的类似问题中了解到的情况,代码可以是单线程和异步的,甚至有人这样画: 异步(一个线程)(学分:): 那么,当被阻塞的部分被解除阻塞时,魔法会发生在哪里呢?方法1和其他方法的执行是
void Method1(Method2);
|Start
|call Method1------------------>|
continues execution of main thread|<------------------------------|
|(okay thanks for the Method |Execution of Method 1
|I will call you when I am done)|but what resource is executing
| <---------------------------- |Method 1????
| callback Method2: Iam done
| ------------------------------>|execution of method 2
| Blocked |very quick not noticable
|<-------------------------------
|continued execution
|End
void方法1(方法2);
|开始
|调用方法1----------------->|
继续执行主线程|通常在Java中,如果不想让UI阻塞,则必须在另一个线程上运行复杂的任务。在不知道这个“fanapi”的情况下,我几乎可以肯定地说,getAsObjectList(…)
正在启动第二个线程
此方法将返回,没有明显的延迟,并允许当前线程继续,即。E防止UI阻塞。它不是同步启动请求,而是启动一个新线程(或者从线程池中获取一个线程),并使用它发送和等待请求。
当接收到响应时,它将从此线程(或者可能是另一个线程)调用您的RequestListener
。也就是说,它不会使用名为getAsObjectList(…)
的线程来运行RequestListener
,因为该线程很久以前就从getAsObjectList(…)
返回,无法再“控制”了。尤其是,不会有什么“魔力”在继续执行的任意点自由中断线程,并将RequestListener
的执行强制填充到其控制流中
⑨:如果从某个线程调用getAllExercises(…)
,该线程是线程池/基于事件队列的并发框架(可能是UI框架的一部分)的一部分,那么实际上可能会有意(甚至只是无意)重用该线程来调用RequestListener
。例如,请参阅,其中所有(客户机)代码仅在单个线程中运行,同时仍允许/鼓励/强制执行异步。但是,在调用getAsObjectList(…)
之前,这仍然不会发生。只有在执行完成之后,线程在其池中返回到某个静止状态,等待更多的任务运行,才可以选择它作为现在调用RequestListener
的线程。好的,我从这里得到它:这是否回答了您的问题?不,然后更新它没有回答的内容。另外,什么说明RequestListener
的实现没有线程化?因为您还没有提供它的实现。同样,在第一个示例中,您声称单个线程是异步的,但是单个线程从来都不是异步的。您在第一张图中画出的是一个线程,通过在多个不同任务上切换工作来执行同步进动。->这是API,“通常在Java中,如果您不想让UI阻塞,您必须在另一个线程上运行复杂的任务。”假设getAsObject不这样做,仅仅提供回调函数不会使代码异步?我们遇到的问题是NetworkOnMainThreadException
,通过添加一个侦听器就解决了这个问题,原因是代码现在是异步的,但我只是没能理解如何实现它?“假设getAsObject不这样做”,我描述的“这个”是什么意思(即,向另一个线程发出请求并立即返回)?没有一个选项它“不这样做”。异步性需要在某个地方启动,因为您不手动执行,所以它是API在内部执行的(这就是为什么您看不到它的原因)。回调本身并不会导致任何异步性,毕竟它只是一些“单调”的对象实例。调用其onResponse
-方法的方式才是区别所在。提示:添加一些System.out.println(Thread.currentThread()+“”+System.getCurrentTimeMillis()+“”)
在您的代码中并观察。至于NetworkOnMainThreadException
:这表明,FAN API对什么是“主”线程以及如何识别它有skme的理解。android中可能有一些标准化的线程/线程组,API会检查这些线程/线程组-我不是android方面的专家。“常规”(意思是非android)Java库忽略了周围的线程框架(只要它不支持某种形式的集成),因为可能根本就没有。”回调本身并没有引发任何异步性,毕竟它只是一些“枯燥”的对象实例。其onResponse方法的调用方式才是区别所在“这就是我所需要的,非常感谢。我开始质疑我所知道的关于代码执行的一切。我还认为是getAsObject()
的内部实现使代码异步,这是唯一可能的解释。
public void getAllExercises(RequestListener<List<Exercise>> listener) {
getAllExercisesRequest().getAsObjectList(Exercise.class, listener);
}
class sometingAdapter extends something{
someMethod(param){
.
.
.
//some code before the Method call
DBClient.getstandardDBClient().getAllExercises(new RequestListener<List<Exercise>>() {
@Override
public void onResponse(List<Exercise> response) {
arrayAdapter.addAll(response);
arrayAdapter.notifyDataSetChanged();
}
});
//some additional code
return v;
}-> end of the method
}
void Method1(Method2);
|Start
|call Method1------------>|
| |
| Blocked?? |Execution of Method 1
| |
| <-----------------------|
| callback Method2
| continued execution
|
|
|End
void Method1(Method2);
|Start
|call Method1------------------>|
continues execution of main thread|<------------------------------|
|(okay thanks for the Method |Execution of Method 1
|I will call you when I am done)|but what resource is executing
| <---------------------------- |Method 1????
| callback Method2: Iam done
| ------------------------------>|execution of method 2
| Blocked |very quick not noticable
|<-------------------------------
|continued execution
|End