隐藏

autojs之多线程-Threads

发布:2023/10/27 23:57:55作者:管理员 来源:本站 浏览次数:767

autojs多线程新手入门


   前言

   一、多线程使用须知

   二、个人理解

   三、多线程常用函数

       1.子线程开启函数

       2.子线程停止函数

       3.等待线程执行完成

       4.返回线程是否存活

       5.等待线程开始执行

       5.单次定时器

       6.循环定时器

   四、多线程里的定时器

   五、弹窗检测

   总结


autojs之多线程-Threads

前言


我也是初初接触多线程,对于小白来说,可能会觉得无从下手,我刚开始也是毫无头绪,对一些奇奇怪怪的问题搞不明白,比如:子线程和主线程谁放在前面有影响吗?sleep()对线程运行有什么影响?处理突发情况,如弹窗时,怎么暂停其他线程? 等等等


在这里,我就从一个小白的角度,说明一下多线程到底怎么用,

若有错误,感谢指出

一、多线程使用须知


   threads模块提供了多线程支持,可以启动新线程来运行脚本。


   脚本主线程会等待所有子线程执行完成后才停止执行,因此如果子线程中有死循环,请在必要的时候调用exit()来直接停止脚本或threads.shutDownAll()来停止所有子线程。


   通过threads.start()启动的所有线程会在脚本被强制停止时自动停止。


   由于JavaScript自身没有多线程的支持,因此您可能会遇到意料之外的问题。

   引自https://hyb1996.github.io/AutoJs-Docs/#/threads


二、个人理解


threads.start(function () {

   while (true) {

       console.error('子1开始运行-------------开始');

       console.error('假设是子1的运行程序');

       sleep(2000)

       console.error('1运行结束----------------结束');


   }

})

i=0

log("主线程" + i++)

threads.start(function () {

   while (true) {

       console.warn('子2开始运行-------------开始');

       console.warn('假设是子2的运行程序');

       sleep(1000)

       console.warn('2运行结束----------------结束');

   }

})


log("主线程" + i++)

if (i == 2) {

   sleep(2000)

   exit()

}

threads.start(function () {

   while (true) {

       console.info('子3开始运行-------------开始');

       console.info('假设是子3的运行程序');

       sleep(500)

       console.info('3运行结束----------------结束');

   }

})


 




以下是我对多线程的理解,若有错误,感谢指出!

1.程序自上而下按顺序运行,

主线程语句就直接运行,

运行到 线程开启函数 threads.start(function(){}) 时开启子线程(线程开启也需要时间),几乎同时运行子线程里的内容,以及该线程后的程序内容

根据以上程序的运行结果,可以看到,在17s的时候几乎同时(其实就是程序顺序运行)运行了子线程一,主线程,子线程二,主线程;

然后子线程一进入sleep(2000),子线程二进入sleep(1000),主线程进入sleep(2000);

2.多线程时运行状态

18s时,程序运行了三个线程:子线程一,子线程二,主线程

子线程二sleep1s后,本次循环结束,开始下一循环

子线程一和主线程还在sleep

3.多线程同时运行的情况

19s时,子线程一和主线程以及子线程二几乎同时结束sleep,

但是子线程一比主线程快一点点,主线程比子线程二快一点点,

所以运行结果是先运行子线程一,然后运行主线程的exit(),程序结束,子线程二就没有机会输出了

三、多线程常用函数

1.子线程开启函数


var 子线程 = threads.start(function(){

   while(true){

       log("子线程");

   }

});


 


2.子线程停止函数


子线程.interrupt();


  


threads.shutDownAll();

//停止所有通过threads.start()启动的子线程。




3.等待线程执行完成


子线程.join([timeout]);

//等待线程执行完成。如果timeout为0,则会一直等待直至该线程执行完成;否则最多等待timeout毫秒的时间。




4.返回线程是否存活


子线程.isAlive()

//返回线程是否存活。




5.等待线程开始执行


子线程.waitFor()

//等待线程开始执行。调用threads.start()以后线程仍然需要一定时间才能开始执行


 


5.单次定时器


var 子线程 = threads.start(function(){

   setTimeout(function(){

//do something

}, 1000);

});

子线程.setTimeout(function(){

   //do something

}, 1000);


  


6.循环定时器


var 子线程 = threads.start(function(){

   setInterval(function(){

//do something

}, 1000);

});

子线程.setInterval(function(){

   //do something

}, 1000);


  


四、多线程里的定时器


var thread = threads.start(function () {

   log("先运行这一句,然后开启定时器,1s后输出\"子线程:\",开启定时器后就继续运行,开启单次定时器,运行主线程");

   //在子线程执行的定时器

   setInterval(function () {

       log("子线程:");

   }, 1000);

});//只能放在前面,不然运行到主线程,若有死循环就没法开启子线程


//等待子线程启动

thread.waitFor();

//在子线程执行的定时器

thread.setTimeout(function () {//单次定时器

   //在子线程执行的定时器

   log("运行到此定时器后,2s后输出此行");

}, 2000);


for(i=0;i<5;i++) {

   log("当前线程为主线程-"+i);

   sleep(3000)

}


sleep(5000);

thread.interrupt();

exit()




不懂定时器的小伙伴,可以看一下我的这篇文章:autojs之定时器-setInterval()/setTimeout()

五、弹窗检测


var 弹窗检测 = threads.start(function () {

   //在子线程执行的定时器

   setInterval(function () {

       log("弹窗检测中");

       if(){

           toastLog("弹窗出现");

       }

   }, 2000);

});


 


总结


多线程:

1.代码自上而下运行,这是毋庸置疑的,

开启了的子线程于主线程是同步进行的,所以sleep是各自sleep自己的(其他代码也是,各自运行);

但是对于未开启的子线程,主线程中若有sleep,代码就会在这sleep,不会往下运行(其他代码同理,一直运行主线程加已开启子线程的代码,直到运行到开启子线程)

2.多线程里的定时器

个人感觉和while(1){sleep()…}的作用一模一样,但是实现方法肯定是不同的,我还没有很深的感悟,之后再补充吧

3.暂停其他线程这个还没有思绪,若有好想法的欢迎评论交流