多线程案例②

案例三:定时器

Java标准库中,还提供了定时器的实现。

        定义一个timer添加多个任务,每个任务同时会带一个时间,执行完后,进程没有结束,Timer里内置了线程(前台线程)       

timer.cancle();需要主动结束,否则Timer不知道是否其他地方还要继续添加任务

        Timer中需要一个线程,负责掐时间,等任务到达合适的时间,这个线程就执行,还需要一个队列/数组,能够保存所有schedule进来的任务,

这个线程就可以不停的去扫描上述队列中的每个元素,看每个任务是否到时间了,到时间就执行

如果队列很长,这个遍历过程开销就会很大O(N) 

        每个任务都是带有delay时间的,肯定要先执行时间小的,后执行时间大的。 => 扫描线程就不必执行了,只需要关注队首元素是否到时间了,如果队首元素没到时间,后续其他线程也一定没到时间=> 使用标准库提供的PriorityQueue(线程不安全)手动加锁

 1)线程

2)优先级队列,保存所有任务

        注:ms级别的时间戳:以1970年1月1日0时0分0秒为基准,计算当前时刻和基准时间的秒数/毫秒数/微秒数...之差。

代码

1. MyTimerTask 类

MyTimerTask 类表示一个定时任务,它包含以下内容:

  • time:任务执行的绝对时间(以毫秒为单位的时间戳)。

  • runnable:实际要执行的任务,是一个 Runnable 对象。

  • getTime():获取任务的执行时间。

  • MyTimerTask(Runnable runnable, long delay):构造函数,接受一个 Runnable 任务和一个延迟时间 delay。它会根据当前时间和延迟时间计算出任务的绝对执行时间。

  • run():执行任务,即调用 runnable.run()

  • compareTo(MyTimerTask o):实现 Comparable 接口,用于比较两个任务的执行时间。PriorityQueue 会根据这个方法来排序任务,确保最早执行的任务在队首。

2. MyTimer 类

MyTimer 类是一个定时器,它负责管理任务的调度和执行。它包含以下内容:

  • t:一个线程,负责扫描任务队列并执行任务。

  • queue:一个优先队列(PriorityQueue),用于存储 MyTimerTask 任务。队列会根据任务的执行时间进行排序,最早执行的任务在队首。

  • locker:一个锁对象,用于同步对任务队列的访问。

2.1 schedule(Runnable runnable, long delay) 方法
  • 这个方法用于调度一个任务,任务将在指定的延迟时间 delay 后执行。

  • 它首先创建一个 MyTimerTask 对象,并将其添加到优先队列 queue 中。

  • 然后,它调用 locker.notify() 来唤醒可能正在等待的扫描线程(t),以便它能够检查新添加的任务。

2.2 构造方法
  • 在 MyTimer 的构造方法中,创建并启动了一个扫描线程 t

  • 这个线程会不断地检查任务队列,判断队首任务的执行时间是否已经到达。

    • 如果队列为空,线程会调用 locker.wait() 进入等待状态,直到有新任务被添加并调用 locker.notify()

    • 如果队列不为空,线程会检查队首任务的执行时间:

      • 如果当前时间已经到达或超过了任务的执行时间,线程会从队列中取出任务并执行它。

      • 如果当前时间还未到达任务的执行时间,线程会调用 locker.wait(task.getTime() - curTime) 进入等待状态,直到任务的执行时间到达或新任务被添加。

流程图

<think>嗯,用户想了解Auto.js插件和UniApp,可能需要将它们结合起来使用。首先,我得分别弄清楚这两个是什么,然后再看看它们如何结合或者互补。 Auto.js是一个基于JavaScript的自动化工具,主要用于Android设备上的自动化操作,比如模拟点击、滑动、读取屏幕内容等。用户可能想知道有没有相关的插件可以扩展其功能,或者如何在UniApp中使用Auto.js。 UniApp是一个使用Vue.js开发跨平台应用的框架,可以编译到多个平台如微信小程序、H5、App等。用户可能想了解如何在UniApp项目中集成Auto.js的功能,或者是否有现成的插件支持。 接下来要考虑两者的结合点。因为Auto.js主要用于Android自动化,而UniApp开发的App可能需要调用原生功能。这时候可能需要通过原生插件的方式,将Auto.js的功能封装成UniApp可调用的模块。或者,用户可能想知道是否有现成的UniApp插件已经实现了类似Auto.js的功能。 另外,需要注意权限和平台限制。Auto.js需要无障碍服务等权限,可能在UniApp打包成Android应用时,需要配置相应的权限,并处理不同平台的兼容性问题。 用户的需求可能是在UniApp中实现自动化操作,比如自动填写表单、执行定时任务等。需要确认是否有可行的技术方案,或者是否需要开发自定义原生插件。 还需要考虑安全性问题,Auto.js的某些功能可能被滥用,因此在实际应用中需遵循平台政策。同时,UniApp跨平台的特性和Auto.js的Android专属功能可能存在冲突,需要明确使用场景。 总结来说,回答需要分两部分介绍Auto.js和UniApp,然后讨论可能的集成方式,注意事项,以及实际应用案例或建议。</think>好的,我将分步骤为您介绍 Auto.js 和 UniApp 的基本概念及它们的关联性: 1. **Auto.js 基础** - 定位:基于 JavaScript 的 Android 自动化工具(需 Root 或开启无障碍服务) - 核心能力: - 屏幕操作:$click(x,y)$,$swipe()$ 等坐标控制 - 控件解析:通过 $className()$ 或 $text()$ 定位元素 - 多线程:$threads.start()$ 实现并发任务 - 典型场景:批量处理 App 操作、游戏脚本、自动化测试 2. **UniApp 基础** - 定位:基于 Vue.js 的跨端开发框架 - 核心特性: - 代码复用:一次开发可编译至 iOS/Android/小程序/H5 - 原生扩展:通过 $uni.requireNativePlugin()$ 调用原生能力 - 生态支持:兼容 npm 包和微信小程序 API - 典型场景:快速构建多平台应用 3. **两者的结合可能** - **场景①:UniApp 调用 Auto.js** 需通过 Android 插件桥接,示例流程: ```java // 原生模块代码示例 public class AutoJSModule extends UniModule { @UniJSMethod public void runScript(String script) { // 调用 Auto.js 引擎执行脚本 } } ``` 在 UniApp 中通过 $uni.autoJS.runScript()$ 调用 - **场景②:Auto.js 操控 UniApp 应用** 使用选择器定位元素: $$ let app = className("io.dcloud.HBuilder").findOne() app.child(2).click() $$ 4. **注意事项** - 权限问题:Auto.js 需要特殊权限,可能触发安全检测 - 平台限制:iOS 无法直接使用 Auto.js 原生功能 - 性能影响:高频操作可能导致应用卡顿 5. **替代方案建议** - 轻量级自动化:使用 UniApp 的 $uni.createSelectorQuery()$ 结合触控事件 - 跨端兼容:考虑使用 Appium 等测试框架实现多平台自动化 建议根据具体需求选择技术栈:若需深度 Android 自动化可集成 Auto.js,若侧重跨端开发则优先使用 UniApp 原生能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值