鸿蒙OS开发文档 第42页

鸿蒙OS RdbStore

RdbStore public interface RdbStore 提供管理关系数据库 (RDB) 的方法。 此类提供用于创建、查询、更新和删除 RDB 的方法。 嵌套类摘要 修饰符和类型 接口 描述 static class RdbStore.ConflictResolution 表示解决冲突的方法的类型。 字段摘要 修饰符和类型 字段 描述 static int MAX_BATCH_INSERT_SIZE 方法总结 修饰符和类型 方法 描述 void addAttach(String alias, String name, byte[] encryptKey) 附加数据库。 boolean backup(String destName) 以指定名称备份数据库。 boolean backup(String destName, byte[] destEncryptKey) 使用指定的加密密钥以指定名称备份数据库。 ListLong batchInsertOrThrowException(String tableName, ListValuesBucket initialValues, RdbStore.ConflictResolution conflictResolution) 根据冲突处理策略将数据批量插入数据库。 void beginTransaction() 以 EXCLUSIVE 模式开始事务。 void beginTransactionWithObserver(TransactionObserver transactionObserver) 使用侦听器以独占模式开始事务。 Statement buildStatement(String sql) 将 SQL 语句编译成可重用的语句。 void changeEncryptKey(byte[] newEncryptKey) 更改打开的加密数据库的加密密钥。 boolean checkIntegrity() 检查主数据库和附加数据库的完整性。 void close() 关闭一个 RDB。 void configLocale(Locale locale) 设置数据库区域设置。 long count(String tableName, String whereClause, String[] whereArgs) 查询RDB存储中满足指定条件的行数。 long count(AbsRdbPredicates absRdbPredicates) 获取数据满足 AbsRdbPredicates 的指定实例对象的行数。 int delete(AbsRdbPredicates absRdbPredicates) 根据 AbsRdbPredicates 的指定实例对象从数据库中删除数据。 void endTransaction() 结束交易。 void executeSql(String sql) 执行不返回值的 SQL 语句。 void executeSql(String sql, Object[] sqlArgs) 执行包含指定参数但不返回值的 SQL 语句。 String getPath() 获取数据库文件的路径。 int getVersion() 获取数据库版本。 void giveConnectionTemporarily(long milliseconds) 暂时断开与数据库的连接以允许其他线程使用数据库。 long insert(String table, ValuesBucket initialValues) 在目标表中插入一行数据。 long insertOrThrowException(String table, ValuesBucket initialValues) 在目标表中插入一行数据。 long insertWithConflictResolution(String table, ValuesBucket initialValues, RdbStore.ConflictResolution conflictResolution) 在目标表中插入一行数据并指定解决冲突的方法。 boolean isHoldingConnection() 检查此线程是否拥有数据库连接。 boolean isInTransaction() 检查当前线程是否正在进行事务。 boolean isMemoryRdb() 检查数据库是否在内存中打开。 boolean isOpen() 检查数据库是否打开。 boolean isReadOnly() 检查数据库是否以只读模式打开。 ListPairString,String listAttached() 查询附加数据库列表。 void markAsCommit() 将当前事务标记为提交。 ResultSet query(AbsRdbPredicates absRdbPredicates, String[] columns) 根据指定条件查询数据库中的数据。...

鸿蒙OS DataObserver

DataObserver 更新时间: 2021-11-01 17:20 public interface DataObserver 表示数据观察者。 数据观察器用作 ResultSet.registerObserver(ohos.data.rdb.DataObserver) 和 ResultSet.unregisterObserver(ohos.data.rdb.DataObserver) 方法的输入参数。 方法总结 修饰符和类型 方法 描述 void onChange() 当结果集中的数据发生变化时调用。 方法详情 onChange void onChange() 当结果集中的数据发生变化时调用。 您可以定义调用此方法后应用的逻辑以满足您的业务需求。

鸿蒙OS WeakHashMap

WeakHashMap java.lang.Object |—java.util.AbstractMap<K,V& |—|—java.util.WeakHashMap<K,V& public class WeakHashMap<K,V> extends AbstractMap<K,V> implements Map<K,V> Map 接口的基于哈希表的实现,带有弱键。 WeakHashMap 中的条目在其键不再常用时将被自动删除。 更准确地说,给定键的映射的存在不会阻止该键被垃圾收集器丢弃,也就是说,使其可终结,最终确定,然后回收。 当一个键被丢弃时,它的条目被有效地从映射中删除,所以这个类的行为与其他映射实现有些不同。 支持空值和空键。 该类具有与HashMap类相似的性能特点,并且具有相同的初始容量和负载因子的效率参数。 像大多数集合类一样,这个类是不同步的。 可以使用 Collections#synchronizedMap 方法构造同步的 WeakHashMap。 此类主要用于关键对象,其 equals 方法使用 == 运算符测试对象身份。 一旦这样的键被丢弃,它就永远无法重新创建,因此以后不可能在 WeakHashMap 中查找该键并惊讶于它的条目已被删除。 此类将非常适用于其 equals 方法不基于对象标识的关键对象,例如 String 实例。 然而,使用这种可重新创建的键对象,自动删除键已被丢弃的 WeakHashMap 条目可能会令人困惑。 WeakHashMap 类的行为部分取决于垃圾收集器的行为,因此一些熟悉的(尽管不是必需的)Map 不变量不适用于此类。 因为垃圾收集器可能随时丢弃键,所以 WeakHashMap 可能表现得好像一个未知线程正在默默地删除条目。 特别是,即使您在 WeakHashMap 实例上进行同步并且不调用它的任何 mutator 方法,size 方法也有可能随着时间的推移返回较小的值,isEmpty 方法返回 false 然后返回 true,containsKey 方法返回 给定键的 true 和 false,get 方法返回给定键的值,但稍后返回 null,put 方法返回 null,remove 方法返回 false,之前出现在 映射,并用于对键集、值集合和条目集的连续检查,以产生连续较少数量的元素。 WeakHashMap 中的每个键对象都间接存储为弱引用的所指对象。 因此,只有在映射内部和外部的弱引用已被垃圾收集器清除后,才会自动删除键。 实现说明:WeakHashMap 中的值对象由普通的强引用保存。 因此,应注意确保值对象不会直接或间接地强烈引用它们自己的键,因为这将防止键被丢弃。 请注意,值对象可以通过 WeakHashMap 本身间接引用其键; 也就是说,一个值对象可以强引用某个其他键对象,其关联的值对象反过来又强引用第一个值对象的键。 如果映射中的值不依赖于持有对它们的强引用的映射,解决此问题的一种方法是在插入之前将值本身包装在 WeakReferences 中,如:m.put(key, new WeakReference(value)), 然后在每次获取时打开包装。 由此类的所有“集合视图方法”返回的集合的迭代器方法返回的迭代器是快速失败的:如果在创建迭代器后的任何时间对映射进行结构修改,除了通过迭代器自己的删除之外的任何方式 方法,迭代器将抛出 ConcurrentModificationException。 因此,面对并发修改,迭代器快速而干净地失败,而不是在未来不确定的时间冒任意的、非确定性的行为。 请注意,不能保证迭代器的快速失败行为,因为一般来说,在存在不同步的并发修改的情况下,不可能做出任何硬保证。 快速失败的迭代器会尽最大努力抛出 ConcurrentModificationException。 因此,编写一个依赖于这个异常的正确性的程序是错误的:迭代器的快速失败行为应该只用于检测错误。 此类是 Java 集合框架的成员。 嵌套类摘要 从类 java.util.AbstractMap 继承的嵌套类/接口 AbstractMap.SimpleEntryK,V, AbstractMap.SimpleImmutableEntryK,V 从接口 java.util.Map 继承的嵌套类/接口 Map.EntryK,V 构造函数摘要 构造函数 描述 WeakHashMap() 构造一个具有默认初始容量 (16) 和加载因子 (0.75) 的新的空 WeakHashMap。 WeakHashMap(int initialCapacity) 使用给定的初始容量和默认加载因子 (0.75) 构造一个新的空 WeakHashMap。 WeakHashMap(int initialCapacity, float loadFactor) 使用给定的初始容量和给定的负载因子构造一个新的空 WeakHashMap。 WeakHashMap(Map<? extends K,? extends V> m) 构造一个与指定映射具有相同映射的新 WeakHashMap。 方法总结 修饰符和类型 方法 描述 void...

鸿蒙OS Vector

Vector java.lang.Object |—java.util.AbstractCollection<E& |—|—java.util.AbstractList<E& |—|—|—java.util.Vector<E& public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable Vector 类实现了一个可增长的对象数组。 像数组一样,它包含可以使用整数索引访问的组件。 但是,Vector 的大小可以根据需要增加或缩小,以适应在创建 Vector 后添加和删除项目。 每个向量都试图通过维护容量和容量增量来优化存储管理。 容量总是至少与向量大小一样大; 它通常更大,因为随着组件被添加到向量中,向量的存储以块的形式增加容量增量的大小。 应用程序可以在插入大量组件之前增加向量的容量; 这减少了增量重新分配的数量。 此类的 iterator 和 listIterator 方法返回的迭代器是快速失败的:如果在创建迭代器后的任何时间对向量进行结构修改,除了通过迭代器自己的 ListIterator#remove() 或 ListIterator#add(Object) 之外的任何方式 方法,迭代器将抛出 ConcurrentModificationException。 因此,面对并发修改,迭代器快速而干净地失败,而不是在未来不确定的时间冒着任意的、非确定性的行为。 elements 方法返回的枚举不是快速失败的。 请注意,不能保证迭代器的快速失败行为,因为一般来说,在存在不同步的并发修改的情况下,不可能做出任何硬保证。 快速失败的迭代器会尽最大努力抛出 ConcurrentModificationException。 因此,编写一个依赖于这个异常的正确性的程序是错误的:迭代器的快速失败行为应该只用于检测错误。 从 Java 2 平台 v1.2 开始,该类被改进为实现 List 接口,使其成为 Java Collections Framework 的成员。 与新的集合实现不同,Vector 是同步的。 如果不需要线程安全实现,建议使用 ArrayList 代替 Vector。 字段摘要 修饰符和类型 字段 描述 protected int capacityIncrement 当向量的大小变得大于其容量时,向量的容量自动增加的量。 protected int elementCount 此 Vector 对象中的有效组件数。 protected Object[] elementData 存储向量分量的数组缓冲区。 从类 java.util.AbstractList 继承的字段 modCount 构造函数摘要 构造函数 描述 Vector() 构造一个空向量,使其内部数据数组的大小为 10,其标准容量增量为零。 Vector(int initialCapacity) 构造一个具有指定初始容量且容量增量为零的空向量。 Vector(int initialCapacity, int capacityIncrement) 构造一个具有指定初始容量和容量增量的空向量。 Vector(Collection<? extends E> c) 按照集合的迭代器返回的顺序构造一个包含指定集合元素的向量。 方法总结 修饰符和类型 方法 描述 void add(int index, E element) 在此 Vector 中的指定位置插入指定元素。 boolean add(E e) 将指定元素附加到此 Vector 的末尾。 boolean addAll(int index, Collection<? extends E> c) 将指定 Collection 中的所有元素插入到此 Vector 的指定位置。 boolean addAll(Collection<? extends E> c) 将指定 Collection 中的所有元素附加到此 Vector 的末尾,按照指定 Collection 的 Iterator 返回的顺序。 void addElement(E obj) 将指定的组件添加到此向量的末尾,将其大小增加一。 int capacity() 返回此向量的当前容量。 void clear() 从此 Vector 中删除所有元素。 Object clone() 返回此向量的克隆。 boolean...

鸿蒙OS UUID

UUID java.lang.Object |—java.util.UUID public final class UUID extends Object implements Serializable, Comparable<UUID> 表示不可变的通用唯一标识符 (UUID) 的类。 UUID 代表一个 128 位的值。 这些全局标识符存在不同的变体。 此类的方法用于操作 Leach-Salz 变体,尽管构造函数允许创建 UUID 的任何变体(如下所述)。 变体 2 (Leach-Salz) UUID 的布局如下: 最重要的 long 由以下无符号字段组成: 0xFFFFFFFF00000000 time_low 0x00000000FFFF0000 time_mid 0x000000000000F000 version 0x0000000000000FFF time_hi 最不重要的 long 由以下无符号字段组成: 0xC000000000000000 variant 0x3FFF000000000000 clock_seq 0x0000FFFFFFFFFFFF node 变量字段包含一个标识 UUID 布局的值。 上述位布局仅对变体值为 2 的 UUID 有效,表示 Leach-Salz 变体。 version 字段包含一个描述此 UUID 类型的值。 UUID 有四种不同的基本类型:基于时间、DCE 安全、基于名称和随机生成的 UUID。 这些类型的版本值分别为 1、2、3 和 4。 构造函数摘要 构造函数 描述 UUID(long mostSigBits, long leastSigBits) 使用指定的数据构造一个新的 UUID。 方法总结 修饰符和类型 方法 描述 int clockSequence() 与此 UUID 关联的时钟序列值。 int compareTo(UUID val) 将此 UUID 与指定的 UUID 进行比较。 boolean equals(Object obj) 将此对象与指定对象进行比较。 static UUID fromString(String name) 根据 toString() 方法中描述的字符串标准表示创建 UUID。 long getLeastSignificantBits() 返回此 UUID 的 128 位值的最低有效 64 位。 long getMostSignificantBits() 返回此 UUID 的 128 位值的最高有效 64 位。 int hashCode() 返回此 UUID 的哈希码。 static UUID nameUUIDFromBytes(byte[] name) 基于指定字节数组检索类型 3(基于名称)UUID 的静态工厂。 long node() 与此 UUID 关联的节点值。 static UUID randomUUID() 用于检索类型 4(伪随机生成)UUID 的静态工厂。 long timestamp() 与此 UUID 关联的时间戳值。 String toString() 返回表示此 UUID 的 String 对象。 int variant() 与此 UUID 关联的变体编号。...

鸿蒙OS TreeSet

TreeSet java.lang.Object |—java.util.AbstractCollection<E& |—|—java.util.AbstractSet<E& |—|—|—java.util.TreeSet<E& public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, Serializable 基于 TreeMap 的 NavigableSet 实现。 元素使用它们的 Comparable 排序,或者由在集合创建时提供的 Comparator 排序,具体取决于使用的构造函数。 此实现为基本操作(添加、删除和包含)提供有保证的 log(n) 时间成本。 请注意,如果要正确实现 Set 接口,集合维护的顺序(无论是否提供显式比较器)必须与 equals 一致。 (参见 Comparable 或 Comparator 以获得与 equals 一致的精确定义。)这是因为 Set 接口是根据 equals 操作定义的,但 TreeSet 实例使用其 compareTo(或 compare)方法执行所有元素比较,所以两个 从集合的角度来看,这种方法认为相等的元素是相等的。 一个集合的行为是明确定义的,即使它的顺序与equals不一致; 它只是不遵守 Set 接口的一般约定。 请注意,此实现不同步。 如果多个线程同时访问一个树集,并且至少有一个线程修改了该树集,则它必须在外部同步。 这通常是通过在一些自然封装集合的对象上同步来完成的。 如果不存在这样的对象,则应使用 Collections#synchronizedSortedSet 方法“包装”该集合。 这最好在创建时完成,以防止对集合的意外不同步访问: SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...)); 此类的迭代器方法返回的迭代器是快速失败的:如果在创建迭代器后的任何时间修改集合,除了通过迭代器自己的 remove 方法之外的任何方式,迭代器将抛出 ConcurrentModificationException。 因此,面对并发修改,迭代器快速而干净地失败,而不是在未来不确定的时间冒任意的、非确定性的行为。 请注意,不能保证迭代器的快速失败行为,因为一般来说,在存在不同步的并发修改的情况下,不可能做出任何硬保证。 快速失败的迭代器会尽最大努力抛出 ConcurrentModificationException。 因此,编写一个依赖于这个异常的正确性的程序是错误的:迭代器的快速失败行为应该只用于检测错误。 此类是 Java 集合框架的成员。 构造函数摘要 构造函数 描述 TreeSet() 构造一个新的空树集,根据其元素的自然顺序排序。 TreeSet(Collection<? extends E> c) 构造一个包含指定集合中元素的新树集,根据其元素的自然顺序排序。 TreeSet(Comparator<? super E> comparator) 构造一个新的空树集,根据指定的比较器排序。 TreeSet(SortedSetE s) 构造一个包含相同元素并使用与指定排序集相同的顺序的新树集。 方法总结 修饰符和类型 方法 描述 boolean add(E e) 如果指定的元素尚不存在,则将其添加到此集合中。 boolean addAll(Collection<? extends E> c) 将指定集合中的所有元素添加到此集合中。 E ceiling(E e) 返回此集合中大于或等于给定元素的最小元素,如果没有这样的元素,则返回 null。 void clear() 从此集合中移除所有元素。 Object clone() 返回此 TreeSet 实例的浅表副本。 Comparator<? super E> comparator() 返回用于对该 set 中的元素进行排序的比较器,如果此 set 使用其元素的 Comparable,则返回 null。 boolean contains(Object o) 如果此集合包含指定的元素,则返回 true。 IteratorE descendingIterator() 按降序返回此 set 中元素的迭代器。 NavigableSetE descendingSet() 返回此集合中包含的元素的逆序视图。 E first()...

鸿蒙OS TreeMap

TreeMap java.lang.Object |—java.util.AbstractMap<K,V& |—|—java.util.TreeMap<K,V& public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, Serializable 基于红黑树的 NavigableMap 实现。 地图根据其键的 Comparable 排序,或者根据地图创建时提供的 Comparator 排序,具体取决于使用的构造函数。 此实现为 containsKey、get、put 和 remove 操作提供有保证的 log(n) 时间成本。 算法是对 Cormen、Leiserson 和 Rivest 的算法简介中的那些算法的改编。 请注意,树形映射维护的顺序,就像任何排序映射一样,以及是否提供显式比较器,如果此排序映射要正确实现 Map 接口,则必须与 equals 保持一致。 (参见 Comparable 或 Comparator 以了解与 equals 一致的精确定义。)这是因为 Map 接口是根据 equals 操作定义的,但排序后的映射使用其 compareTo(或比较)方法执行所有键比较,所以两个 从排序映射的角度来看,此方法认为相等的键是相等的。 已排序映射的行为是明确定义的,即使它的排序与 equals 不一致; 它只是不遵守 Map 接口的一般合同。 请注意,此实现不同步。 如果多个线程同时访问一个映射,并且至少有一个线程在结构上修改了映射,则必须在外部进行同步。 (结构修改是添加或删除一个或多个映射的任何操作;仅更改与现有键关联的值不是结构修改。)这通常通过同步一些自然封装映射的对象来完成。 如果不存在这样的对象,则应使用 Collections#synchronizedSortedMap 方法“包装” map。 这最好在创建时完成,以防止对地图的意外不同步访问: SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...)); 由此类的所有“集合视图方法”返回的集合的迭代器方法返回的迭代器是快速失败的:如果在创建迭代器后的任何时间对映射进行结构修改,除了通过迭代器自己的删除之外的任何方式 方法,迭代器将抛出 ConcurrentModificationException。 因此,面对并发修改,迭代器快速而干净地失败,而不是在未来不确定的时间冒任意的、非确定性的行为。 请注意,不能保证迭代器的快速失败行为,因为一般来说,在存在不同步的并发修改的情况下,不可能做出任何硬保证。 快速失败的迭代器会尽最大努力抛出 ConcurrentModificationException。 因此,编写一个依赖于这个异常的正确性的程序是错误的:迭代器的快速失败行为应该只用于检测错误。 此类中的方法及其视图返回的所有 Map.Entry 对都表示映射在生成时的快照。 它们不支持 Entry.setValue 方法。 (但请注意,可以使用 put 更改关联映射中的映射。) 此类是 Java 集合框架的成员。 嵌套类摘要 从类 java.util.AbstractMap 继承的嵌套类/接口 AbstractMap.SimpleEntryK,V, AbstractMap.SimpleImmutableEntryK,V 从接口 java.util.Map 继承的嵌套类/接口 Map.EntryK,V 构造函数摘要 构造函数 描述 TreeMap() 使用其键的自然顺序构造一个新的空树映射。 TreeMap(Comparator<? super K> comparator) 构造一个新的空树映射,根据给定的比较器排序。 TreeMap(Map<? extends K,? extends V> m) 构造一个包含与给定映射相同映射的新树映射,按照其键的自然顺序排序。 TreeMap(SortedMap<K,? extends V> m) 构造一个新的树形图,其中包含与指定的排序图相同的映射并使用相同的顺序。 方法总结 修饰符和类型 方法 描述 Map.EntryK,V ceilingEntry(K key) 返回与大于或等于给定键的最小键关联的键值映射,如果没有这样的键,则返回 null。 K ceilingKey(K key) 返回大于或等于给定键的最小键,如果没有这样的键,则返回 null。...

鸿蒙OS TimeZone

TimeZone java.lang.Object |—java.util.TimeZone public abstract class TimeZone extends Object implements Serializable, Cloneable TimeZone 表示时区偏移量,也计算夏令时。 通常,您使用 getDefault 获得一个 TimeZone,它根据程序运行的时区创建一个 TimeZone。 例如,对于在日本运行的程序,getDefault 根据日本标准时间创建一个 TimeZone 对象。 您还可以使用 getTimeZone 和时区 ID 获取 TimeZone。 例如,美国太平洋时区的时区 ID 是“America/Los_Angeles”。 因此,您可以通过以下方式获取美国太平洋时间 TimeZone 对象: TimeZone tz = TimeZone.getTimeZone("America/Los_Angeles"); 您可以使用 getAvailableIDs 方法遍历所有受支持的时区 ID。 然后,您可以选择支持的 ID 来获取 TimeZone。 如果您想要的时区不是由受支持的 ID 之一表示,则可以指定自定义时区 ID 以生成 TimeZone。 自定义时区 ID 的语法是: CustomID: GMT Sign Hours : Minutes GMT Sign Hours Minutes GMT Sign Hours Sign: one of + - Hours: Digit Digit Digit Minutes: Digit Digit Digit: one of 0 1 2 3 4 5 6 7 8 9 小时必须介于 0 到 23 之间,分钟必须介于 00 到 59 之间。例如,“GMT+10”和“GMT+0010”分别表示比 GMT 提前十小时和十分钟。 格式与区域无关,数字必须取自 Unicode 标准的基本拉丁语块。 不能使用自定义时区 ID 指定夏令时转换计划。 如果指定的字符串与语法不匹配,则使用“GMT”。 创建 TimeZone 时,指定的自定义时区 ID 以以下语法规范化: NormalizedCustomID: GMT Sign...

鸿蒙OS TimerTask

TimerTask java.lang.Object |—java.util.TimerTask public abstract class TimerTask extends Object implements Runnable 可以由 Timer 安排一次或重复执行的任务。 构造函数摘要 修饰符 构造函数 描述 protected TimerTask() 创建一个新的计时器任务。 方法总结 修饰符和类型 方法 描述 boolean cancel() 取消此计时器任务。 abstract void run() 此计时器任务要执行的操作。 long scheduledExecutionTime() 返回此任务最近一次实际执行的计划执行时间。 从类 java.lang.Object 继承的方法 clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait 构造函数详细信息 TimerTask protected TimerTask() 创建一个新的计时器任务。 方法详情 run public abstract void run() 此计时器任务要执行的操作。 指定者: 在接口 Runnable 中运行 cancel public boolean cancel() 取消此计时器任务。 如果任务已安排为一次性执行但尚未运行,或者尚未安排,则它永远不会运行。 如果任务已被安排重复执行,它将永远不会再次运行。 (如果此调用发生时任务正在运行,则任务将运行到完成,但永远不会再次运行。) 请注意,从重复计时器任务的 run 方法中调用此方法绝对保证计时器任务不会再次运行。 该方法可能会被重复调用; 第二次和后续调用无效。 返回: 如果此任务已安排为一次性执行但尚未运行,或者此任务已安排为重复执行,则为 true。 如果任务被调度为一次性执行并且已经运行,或者如果任务从未被调度,或者如果任务已经被取消,则返回 false。 (简单地说,如果该方法阻止了一个或多个预定执行的发生,则该方法返回 true。) scheduledExecutionTime public long scheduledExecutionTime() 返回此任务最近一次实际执行的计划执行时间。 (如果在任务执行过程中调用此方法,则返回值是当前任务执行的预定执行时间。) 此方法通常从任务的 run 方法中调用,以确定任务的当前执行是否足够及时以保证执行计划的活动: public void run() { if (System.currentTimeMillis() - scheduledExecutionTime() >= MAX_TARDINESS) return; // Too late; skip this execution. // Perform the task } 此方法通常不与固定延迟执行重复任务结合使用,因为它们的计划执行时间允许随时间漂移,因此不是非常重要。 返回: 计划最近执行此任务的时间,采用 Date.getTime() 返回的格式。 如果任务尚未开始其第一次执行,则返回值未定义。

鸿蒙OS Timer

Timer java.lang.Object |—java.util.Timer public class Timer extends Object 线程调度任务以供将来在后台线程中执行的工具。 任务可以安排为一次性执行,或定期重复执行。 对应于每个 Timer 对象的是单个后台线程,用于按顺序执行所有计时器的任务。 定时器任务应该很快完成。 如果一个定时器任务花费了过多的时间来完成,它就会“占用”定时器的任务执行线程。 反过来,这可以延迟后续任务的执行,这些任务可能会在(如果)有问题的任务最终完成时“聚集”并快速连续执行。 在对 Timer 对象的最后一个实时引用消失并且所有未完成的任务都已完成执行后,计时器的任务执行线程优雅地终止(并成为垃圾回收的对象)。 但是,这可能需要任意长的时间才能发生。 默认情况下,任务执行线程不作为守护线程运行,因此它能够防止应用程序终止。 如果调用者想要快速终止定时器的任务执行线程,调用者应该调用定时器的取消方法。 如果计时器的任务执行线程意外终止,例如,因为调用了它的 stop 方法,那么任何进一步尝试在计时器上安排任务都将导致 IllegalStateException,就像调用了计时器的取消方法一样。 这个类是线程安全的:多个线程可以共享一个 Timer 对象而不需要外部同步。 此类不提供实时保证:它使用 Object.wait(long) 方法安排任务。 Java 5.0 引入了 java.util.concurrent 包,其中的并发实用程序之一是 ScheduledThreadPoolExecutor,它是一个线程池,用于以给定的速率或延迟重复执行任务。 它实际上是 Timer/TimerTask 组合的更通用替代品,因为它允许多个服务线程,接受各种时间单位,并且不需要子类化 TimerTask(只需实现 Runnable)。 使用一个线程配置 ScheduledThreadPoolExecutor 使其等效于 Timer。 实施说明:此类可扩展到大量并发计划任务(数千个应该没有问题)。 在内部,它使用二进制堆来表示其任务队列,因此调度任务的成本为 O(log n),其中 n 是并发调度的任务数。 实现说明:所有构造函数都启动一个计时器线程。 构造函数摘要 构造函数 描述 Timer() 创建一个新的计时器。 Timer(boolean isDaemon) 创建一个新的计时器,其关联线程可以指定给 Thread#setDaemon。 Timer(String name) 创建一个新的计时器,其关联线程具有指定的名称。 Timer(String name, boolean isDaemon) 创建一个新的计时器,其关联线程具有指定的名称,并且可以指定给 Thread#setDaemon。 方法总结 修饰符和类型 方法 描述 void cancel() 终止此计时器,丢弃任何当前计划的任务。 int purge() 从此计时器的任务队列中删除所有已取消的任务。 void schedule(TimerTask task, long delay) 安排指定任务在指定延迟后执行。 void schedule(TimerTask task, long delay, long period) 安排指定任务以重复固定延迟执行,在指定延迟后开始。 void schedule(TimerTask task, Date time) 安排指定任务在指定时间执行。 void schedule(TimerTask task, Date firstTime, long period) 从指定时间开始,安排指定任务以重复固定延迟执行。 void scheduleAtFixedRate(TimerTask task, long delay, long period) 安排指定任务以重复固定速率执行,在指定延迟后开始。 void scheduleAtFixedRate(TimerTask task, Date firstTime, long period) 从指定时间开始,安排指定任务以重复固定速率执行。 从类 java.lang.Object 继承的方法 clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait 构造函数详细信息 Timer public Timer() 创建一个新的计时器。 关联的线程没有 Thread#setDaemon。 Timer public Timer(boolean isDaemon) 创建一个新的计时器,其关联线程可以指定给 Thread#setDaemon。 如果计时器将用于安排重复的“维护活动”,则调用守护线程,只要应用程序正在运行,就必须执行该活动,但不应延长应用程序的生命周期。 参数: 参数名称 参数描述 isDaemon 如果关联的线程应该作为守护进程运行,则为 true。 Timer public Timer(String name)...