• 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://www.cnblogs.com/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

  • 相关阅读:
    在linux上搭建sftp服务
    FTP客户端遇到150连接超时错误的处理办法
    电脑每次开机打开微软网站怎么解决
    Linux学习笔记之认识与学习Bash
    Linux学习笔记之VIM编辑器
    Linux学习笔记之文件与文件系统的压缩与打包
    Linux学习笔记之磁盘与文件系统的管理
    Linux学习笔记之目录配置
    Linux学习笔记之档案权限与目录配置
    ubuntu修改apt源
  • 原文地址:https://www.cnblogs.com/attilax/p/5274372.html
Copyright © 2020-2023  润新知