zoukankan      html  css  js  c++  java
  • Atitit. Async await 优缺点 异步编程的原理and实现 java c# php

    Atitit. Async await 优缺点 异步编程的原理and实现 java c# php

     

    1async & await的来源1

    2异步编程history1

    2.1. 线程池 2

    2.2. 返回值2

    2.3. Semaphore 信号量2

    2.4. 线程的异常,主线程可以捕获到么2

    3await并不是针对于async的方法,而是针对async方法所返回给我们的Task,2

    4Java里面的task 跟个 await3

    5---code4

    6async & await的缺点4

    7ref5

     

     

    1. async & await的来源

    不个异步的操作语言级别来完成..   趋势..

    2.  异步编程history

     

    1. static void Main(){  

    2.     new Thread(Go).Start();  // .NET 1.0开始就有的   

    3.     Task.Factory.StartNew(Go); // .NET 4.0 引入了 TPL  

    4.     Task.Run(new Action(Go)); // .NET 4.5 新增了一个Run的方法  

    5. }  

    6.  

    7. public static void Go(){  

    8.     Console.WriteLine("我是另一个线程");  

    9. 

    这里面需要注意的是,创建Thread的实例之后,需要手动调用它的Start方法将其启动。但是对于Task来说,StartNew和Run的同时,既会创建新的线程,并且会立即启动它。

     

    作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙,  EMAIL:1466519819@qq.com

    转载请注明来源: http://blog.csdn.net/attilax

     

    2.1. 线程池 

    线程的创建是比较占用资源的一件事情,.NET 为我们提供了线程池来帮助我们创建和管理线程。Task是默认会直接使用线程池,但是Thread不会。如果我们不使用Task,又想用线程池的话,可以使用ThreadPool类。

     

    2.2. 返回值

    Thead是不能返回值的,但是作为更高级的Task当然要弥补一下这个功能。

     

    2.3. Semaphore 信号量

    我实在不知道这个单词应该怎么翻译,从官方的解释来看,我们可以这样理解。它可以控制对某一段代码或者对某个资源访问的线程的数量,超过这个数量之后,其它的线程就得等待,只有等现在有线程释放了之后,下面的线程才能访问。这个跟锁有相似的功能,只不过不是独占的,它允许一定数量的线程同时访问。

    2.4. 线程的异常,主线程可以捕获到么

     

     

    3. await并不是针对于async的方法,而是针对async方法所返回给我们的Task

    await 实质是在调用awaitable对象的GetResult方法

     

    这也是为什么所有的async方法都必须返回给我们Task。所以我们同样可以在Task前面也加上await关键字,这样做实际上是告诉编译器我需要等这个Task的返回值或者等这个Task执行完毕之后才能继续往下走。

     

    Task.GetAwaiter()和await Task 的区别?

     

    Task.GetAwait()方法会给我们返回一个awaitable的对象,通过调用这个对象的GetResult方法就会挂起主线程,当然也不是所有的情况都会挂起。还记得我们Task的特性么? 在一开始的时候就启动了另一个线程去执行这个Task,当我们调用它的结果的时候如果这个Task已经执行完毕,主线程是不用等待可以直接拿其结果的,如果没有执行完毕那主线程就得挂起等待了。

     

    4. Java里面的task 跟个 await

    Java中的是个futureTask走十.net 中的task..

    java还没语法级别的await,,只可以当库的模式实现..

     

    FutureTask async_task=taskService.async(()->{

    String echo1 = echoCmdResult_asStr(process.getInputStream());

    System.out.println("--echo1:"+echo1);

    returnecho1;

    },10);

    new Thread(async_task).start();

    System.out.println("--start get err stream"+filex.getUUidName());

    FutureTask async_task_err=taskService.async(()->{

    String echo2 = echoCmdResult_asStr(process.getErrorStream());

    System.out.println("--echo2:"+echo2);

    returnecho2;

    },10);

    new Thread(async_task_err).start();

     

     

    r=taskService.<String>await(async_task, 15, "$output_timeout_ex");

    System.out.println("-- finish await std stream"+filex.getUUidName());

    System.out.println("----------------------------------------");

    System.out.println("--start await err stream"+filex.getUUidName());

    String err=taskService.<String>await(async_task_err,1, "$err_stream_timeout_ex");

     

     

    5. ---code

     

    public FutureTask async(Callable objectint timeout_secs ) {

    FutureTask<String> task = new FutureTask<String>(object);

    this.timeout_secs=timeout_secs;

    check_time_out(task);

    return task;

     

    }

     

     

    public <t> t await(FutureTask<t> async_taskint timeout_secs2, Object defVal) {

    try {

    return async_task.get(timeout_secs2, TimeUnit.SECONDS);

    catch (InterruptedException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    catch (ExecutionException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

     

    catch (TimeoutException e) {

    async_task.cancel(true);

    }

    return (t) defVal;

    }

     

    6. async & await的缺点

    只对task型的效果....不能常用的code..

    只好使用task +lambda包装一哈...

     

    FutureTask async_task_err=taskService.async(()->{

    String echo2 = echoCmdResult_asStr(process.getErrorStream());

    System.out.println("--echo2:"+echo2);

    returnecho2;

    },10);

    new Thread(async_task_err).start();

     

    String err=taskService.<String>await(async_task_err,1, "$err_stream_timeout_ex");

     

    7. ref

    async & await 的前世今生 - 51CTO.COM.htm

  • 相关阅读:
    PATA 1071 Speech Patterns.
    PATA 1027 Colors In Mars
    PATB 1038. 统计同成绩学生(20)
    1036. 跟奥巴马一起编程(15)
    PATA 1036. Boys vs Girls (25)
    PATA 1006. Sign In and Sign Out (25)
    读取web工程目录之外的图片并显示
    DOS命令
    java连接oracle集群
    servlet
  • 原文地址:https://www.cnblogs.com/attilax/p/5963441.html
Copyright © 2011-2022 走看看