Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么使异步单线程java代码异步_Java_Asynchronous_Single Threaded - Fatal编程技术网

什么使异步单线程java代码异步

什么使异步单线程java代码异步,java,asynchronous,single-threaded,Java,Asynchronous,Single Threaded,因此,我们目前正在用java开发一个应用程序,一位同事向我介绍了异步编程,无论我对它做了多少研究,对我来说,它似乎是同步的。 因此,异步代码的主要优点似乎是不冻结UI,而某些操作需要很长时间才能执行并返回结果,我们需要做的就是为该函数提供一个回调函数,该函数将在作业完成时调用。根据我从在线资源和stackoverflow的类似问题中了解到的情况,代码可以是单线程和异步的,甚至有人这样画: 异步(一个线程)(学分:): 那么,当被阻塞的部分被解除阻塞时,魔法会发生在哪里呢?方法1和其他方法的执行是

因此,我们目前正在用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