autojs之多线程-Threads

2024-03-26 18:48
文章标签 多线程 autojs threads

本文主要是介绍autojs之多线程-Threads,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

autojs多线程新手入门

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.暂停其他线程这个还没有思绪,若有好想法的欢迎评论交流

如果对你有帮助的话,不妨动动小手点个赞吧,三连也行哦

这篇关于autojs之多线程-Threads的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/849505

相关文章

多线程解析报表

假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成。 Way1 join import java.time.LocalTime;public class Main {public static void main(String[] args) thro

Java 多线程概述

多线程技术概述   1.线程与进程 进程:内存中运行的应用程序,每个进程都拥有一个独立的内存空间。线程:是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换、并发执行,一个进程最少有一个线程,线程实际数是在进程基础之上的进一步划分,一个进程启动之后,进程之中的若干执行路径又可以划分成若干个线程 2.线程的调度 分时调度:所有线程轮流使用CPU的使用权,平均分配时间抢占式调度

Java 多线程的基本方式

Java 多线程的基本方式 基础实现两种方式: 通过实现Callable 接口方式(可得到返回值):

JAVA- 多线程

一,多线程的概念 1.并行与并发 并行:多个任务在同一时刻在cpu 上同时执行并发:多个任务在同一时刻在cpu 上交替执行 2.进程与线程 进程:就是操作系统中正在运行的一个应用程序。所以进程也就是“正在进行的程序”。(Windows系统中,我们可以在任务管理器中看 到进程) 线程:是程序运行的基本执行单元。当操作系统执行一个程序时, 会在系统中建立一个进程,该进程必须至少建立一个线

多线程篇(阻塞队列- LinkedBlockingDeque)(持续更新迭代)

目录 一、LinkedBlockingDeque是什么 二、核心属性详解 三、核心方法详解 addFirst(E e) offerFirst(E e) putFirst(E e) removeFirst() pollFirst() takeFirst() 其他 四、总结 一、LinkedBlockingDeque是什么 首先queue是一种数据结构,一个集合中

多线程篇(阻塞队列- LinkedBlockingQueue)(持续更新迭代)

目录 一、基本概要 1. 构造函数 2. 内部成员 二、非阻塞式添加元素:add、offer方法原理 offer的实现 enqueue入队操作 signalNotEmpty唤醒 删除线程(如消费者线程) 为什么要判断if (c == 0)时才去唤醒消费线程呢? 三、阻塞式添加元素:put 方法原理 图解:put线程的阻塞过程 四、非阻塞式移除:poll方法原理 dequ

spring笔记 多线程的支持

spring的工作机制 136  属性编辑器 140 spring事件的体系结构 168 Bean间的关系 109 继承 依赖 引用     Bean的继承          1 为了简化初始化的属性注入;          2 子Bean和父Bean相同的属性值,使用子Bean的     Bean的依赖 Srping控制相互依赖的Bean之间,属性注入的顺序,防止出错  depend-on

【编程底层思考】详解Java的JUC多线程并发编程底层组件AQS的作用及原理

Java中的AbstractQueuedSynchronizer(简称AQS)是位于java.util.concurrent.locks包中的一个核心组件,用于构建锁和其他同步器。AQS为实现依赖于FIFO(先进先出)等待队列的阻塞锁和相关同步器提供了一套高效、可扩展的框架。 一、AQS的作用 统一同步状态管理:AQS提供了一个int类型的成员变量state,用于表示同步状态。子类可以根据自己

多线程的系列文章

Java多线程学习(一)Java多线程入门 Java多线程学习(二)synchronized关键字(1)   Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多线程学习(四)等待/通知(wait/notify)机制 Java多线程学习(五)线程间通信知识点补充 Java多线程学习(六)Lock锁的使用 Java多

多线程 线程池的创建

一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的。在jdk1.5之后这一情况有了很大的改观。Jdk1.5之后加入了java.util.concurrent包,这个包中主要介绍java中线程以及线程池的使用。为我们在开发中处理线程的问题提供了非常大的帮助。 二:线程池 线程池的作用: 线程池作用就是限制系统中执行线程的数量。