3.0 KiB
先把之前的时间延迟,改回去;
运行之后,根据打印信息可以看到,除了第一个线程id是1,其他线程id都是5;
回到构造函数,可以看到,如果延迟不为空的话,实际上,是一直在while循环里面,跑UpdateTask()的方法;
根据这个false的传参,也就可以知道,方法体,是不会放到前面定义的队列里面;
在taskDic里面,遍历循环,满足条件的任务,执行相关的回调函数;
而这些一系列操作,都是属于,这个new出来的线程的id,也就是打印信息里面的id为5的线程;
弄一个新的函数出来,将第二个传参,改成true,也就是方法体,会放到一个queue队列中,统一处理;
如果是true的情况,就是会调用一下,这个HandleTask的函数,去调用对应队列中的回调方法;
再跑一个异步的任务方法;
可以看到,线程id是不停变化的;
可以看到,task的异步调用,是从队列里,拿数据包的cb委托,去invoke出发调用;
这个过程,是在线程池里,自动去调度,这个是无法通过程序控制的;
继续修改传参,第一个延迟的参数,设置成0,第二个sethandle相关的布尔,也设置成false,这样就是不会创建队列了;
在异步调用的方法里,也修改一下,调用的方法接口,不使用HandleTask()的方式,而是直接使用UpdateTask()的形式;
可以看到,调用的线程,是不断变化的,也就是自动在线程池里面,不断自动用不同的线程去调度, 补充一下,UpdateTask()相关方法:
继续,如果把这个await延迟去掉;
这时候,实际上,就是变成了,同步执行的方式了;
重新运行,可以看到线程id,都是同一个了,而且间隔差,变成0了;
继续修改参数,把第二个setHandle的参数,设置为true,也就是,又会把回调,都放在queue队列里;
队列任务的执行,是在这个HandleTask()里面执行的,所以,又取消注释;
可以看到,也都是在同一个线程中,执行的;
再取消这个await的注释;
重新运行,可以看到,又自动调度到,不同的线程了;