2021-11-09

常见类和接口的源码翻译

Runnable

Runnable 接口应该由其实例打算由线程执行的任何类实现。 该类必须定义一个名为 run 的无参数方法。
该接口旨在为希望在活动时执行代码的对象提供通用协议。 例如,Runnable 是由类 Thread 实现的。 处于活动状态仅意味着线程已启动且尚未停止。
此外,Runnable 提供了使类处于活动状态而不是子类化 Thread 的方法。 通过实例化 Thread 实例并将自身作为目标传入,实现 Runnable 的类可以在不继承 Thread 的情况下运行。 在大多数情况下,如果您只打算覆盖 run() 方法而不打算覆盖其他 Thread 方法,则应该使用 Runnable 接口。 这很重要,因为除非程序员打算修改或增强类的基本行为,否则类不应被子类化。

public interface Runnable{
	当使用实现接口 Runnable 的对象创建线程时,启动线程会导致在单独执行的线程中调用对象的 run 方法。
	方法 run 的一般约定是它可以采取任何行动。
	也可以看看:线程运行()
 public abstract void run();
}

Thread

线程是程序中的执行线程。 Java 虚拟机允许应用程序同时运行多个执行线程。
每个线程都有一个优先级。具有较高优先级的线程优先于具有较低优先级的线程执行。每个线程可能也可能不会被标记为守护进程。当在某个线程中运行的代码创建一个新的 Thread 对象时,新线程的优先级最初设置为等于创建线程的优先级,并且当且仅当创建线程是守护进程时,新线程才是守护线程。
当 Java 虚拟机启动时,通常有一个非守护线程(通常调用某个指定类的名为 main 的方法)。 Java 虚拟机继续执行线程,直到发生以下任一情况:
已调用 Runtime 类的退出方法并且安全管理器已允许退出操作发生。
所有不是守护线程的线程都已经死亡,要么是从对 run 方法的调用返回,要么是通过抛出传播到 run 方法之外的异常。
有两种方法可以创建新的执行线程。一种是将类声明为Thread的子类。这个子类应该覆盖类 Thread 的 run 方法。然后可以分配和启动子类的实例。例如,计算大于规定值的素数的线程可以写成如下:

	 class PrimeThread extends Thread {
       long minPrime;
       PrimeThread(long minPrime) {
           this.minPrime = minPrime;
       }
       public void run() {
           // compute primes larger than minPrime
            . . .
       }
   }
public class Thread implements Runnable{
}

Throwable

Throwable 类是 Java 语言中所有错误和异常的超类。只有作为此类(或其子类之一)的实例的对象才会被 Java 虚拟机抛出或可以被 Java throw 语句抛出。同样,只有此类或其子类之一可以是 catch 子句中的参数类型。出于编译时异常检查的目的,Throwable 和 Throwable 的任何子类(不是 RuntimeException 或 Error 的子类)都被视为已检查异常。
两个子类的实例,Error 和 Exception,通常用于指示发生了异常情况。通常,这些实例是在异常情况的上下文中新创建的,以便包含相关信息(例如堆栈跟踪数据)。
throwable 包含创建时其线程的执行堆栈的快照。它还可以包含一个消息字符串,提供有关错误的更多信息。随着时间的推移,一个 throwable 可以抑制其他 throwable 的传播。最后,throwable 还可以包含一个原因:另一个导致该 throwable 被构造的 throwable。这种因果信息的记录被称为链式异常设施,因为原因本身可以有一个原因,等等,导致异常“链”,每个异常都是由另一个引起的。
throwable 可能有原因的一个原因是抛出它的类建立在较低层的抽象之上,而上层的操作由于下层的失败而失败。让下层抛出的 throwable 向外传播是不好的设计,因为它通常与上层提供的抽象无关。此外,这样做会将上层的 API 与其实现的细节联系起来,假设下层的异常是已检查的异常。抛出“包装异常”(即包含原因的异常)允许上层将失败的详细信息传达给其调用者,而不会导致这些缺点中的任何一个。它保留了更改上层实现的灵活性,而无需更改其 API(特别是其方法抛出的异常集)。
throwable 可能有一个原因的第二个原因是,抛出它的方法必须符合不允许该方法直接抛出原因的通用接口。例如,假设一个持久化集合符合 Collection 接口,并且它的持久化是在 java.io 之上实现的。假设 add 方法的内部可以抛出 IOException。通过将 IOException 包装在适当的未检查异常中,实现可以将 IOException 的详细信息传达给其调用者,同时符合 Collection 接口。 (持久集合的规范应该表明它能够抛出这样的异常。)
原因可以通过两种方式与 throwable 相关联:通过将原因作为参数的构造函数,或通过 initCause(Throwable) 方法。希望允许原因与它们相关联的新可抛出类应提供采用原因的构造函数并委托(可能间接)给采用原因的 Throwable 构造函数之一。因为 initCause 方法是公共的,它允许将原因与任何 throwable 相关联,甚至是“遗留的 throwable”,其实现早于向 Throwable 添加异常链机制。
按照惯例,Throwable 类及其子类有两个构造函数,一个不接受参数,另一个接受可用于生成详细消息的 String 参数。此外,那些可能具有与其相关联的原因的子类应该有另外两个构造函数,一个采用 Throwable(原因),另一个采用 String(详细消息)和 Throwable(原因)。

public class Throwable implemets Serializable{
}

BigDecimal

不可变的、任意精度的有符号十进制数。 BigDecimal 由一个任意精度的整数非标度值和一个 32 位整数标度组成。如果为零或正数,则刻度是小数点右侧的位数。如果为负,则数字的未缩放值乘以 10 的缩放负值的幂。因此,由 BigDecimal 表示的数字的值是 (unscaledValue × 10-scale)。
BigDecimal 类提供算术、缩放操作、舍入、比较、散列和格式转换的操作。 toString 方法提供了 BigDecimal 的规范表示。
BigDecimal 类使用户可以完全控制舍入行为。如果没有指定舍入方式且无法表示准确结果,则抛出异常;否则,可以通过向操作提供适当的 MathContext 对象,以选定的精度和舍入模式执行计算。无论哪种情况,都提供了八种舍入模式来控制舍入。使用此类中的整数字段(例如 ROUND_HALF_UP)来表示舍入模式在很大程度上已过时;应该使用 RoundingMode 枚举的枚举值(例如 RoundingMode.HALF_UP)。

当 MathContext 对象的精度设置为 0(例如 MathContext.UNLIMITED)时,算术运算是精确的,不采用 MathContext 对象的算术方法也是如此。 (这是 5 之前版本中唯一支持的行为。)作为计算精确结果的必然结果,精度设置为 0 的 MathContext 对象的舍入模式设置未使用,因此无关紧要。在除法的情况下,精确商可以有无限长的十进制展开;例如,1 除以 3。如果商有一个非终止的十进制扩展并且指定操作返回精确结果,则抛出 ArithmeticException。否则,将返回除法的确切结果,就像其他操作一样。
当精度设置不为 0 时,BigDecimal 算术规则与 ANSI X3.274-1996 和 ANSI X3.274-1996/AM 1-2000(第 7.4 节)中定义的所选算术运算模式广泛兼容。与那些标准不同,BigDecimal 包括许多舍入模式,这些模式在 BigDecimal 5 之前的版本中是强制性的。这些 ANSI 标准与 BigDecimal 规范之间的任何冲突都将得到解决,以支持 BigDecimal。
由于相同的数值可以有不同的表示(具有不同的比例),因此算术和舍入规则必须指定数值结果和结果表示中使用的比例。
一般来说,舍入模式和精度设置决定了当确切结果的位数(在除法的情况下可能是无限多)多于返回的位数时,运算如何返回具有有限位数的结果。首先,要返回的总位数由 MathContext 的精度设置指定;这决定了结果的精度。数字计数从精确结果的最左边的非零数字开始。舍入模式确定任何丢弃的尾随数字如何影响返回的结果。
对于所有算术运算符,操作的执行就像首先计算精确的中间结果,然后使用选定的舍入模式舍入到精度设置指定的位数(如有必要)。如果未返回精确结果,则丢弃精确结果的某些数字位置。当舍入增加返回结果的幅度时,有可能通过传播到前导“9”数字的进位来创建新的数字位置。例如,将值 999.9 舍入为三位数四舍五入在数字上等于一千,表示为 100×101。在这种情况下,新的“1”是返回结果的前导数字位置。
除了逻辑上的精确结果,每个算术运算都有一个表示结果的首选比例。下表列出了每个操作的首选规模。
算术运算结果的首选量表
手术
首选结果量表
添加
最大值(加数。标度(),加数。标度())
减去
最大值(minuend.scale(),subtrahend.scale())

multiplier.scale() + multiplier.scale()
划分
红利.scale() - 除数.scale()
这些尺度是返回精确算术结果的方法所使用的尺度;除了精确的除法可能必须使用更大的比例,因为精确的结果可能有更多的数字。例如,1/32 是 0.03125。

在四舍五入之前,逻辑精确中间结果的比例是该操作的首选比例。如果精确的数值结果不能用精度数字表示,则舍入选择要返回的数字集,结果的小数位数从中间结果的小数位数减少到可以表示实际返回的精度数的最小小数位数。如果精确结果最多可以用精度数字表示,则返回与首选比例最接近的比例的结果表示。特别是,可以通过去除尾随零和减小比例以少于精度的数字来表示可精确表示的商。例如,使用floor舍入方式四舍五入为三位数,19/100 = 0.19 // integer=19, scale=2 but 21/110 = 0.190 // integer=190, scale=3
请注意,对于加法、减法和乘法,比例的减少将等于被丢弃的确切结果的数字位置数。如果舍入导致进位传播以创建新的高位数字位置,则与未创建新数字位置时相比,结果的额外数字将被丢弃。
其他方法的舍入语义可能略有不同。例如,使用指定算法的 pow 方法的结果有时可能与舍入后的数学结果相差一个以上的单位,即一个 ulp。
提供了两种类型的操作来操纵 BigDecimal 的比例:缩放/舍入操作和小数点移动操作。缩放/舍入操作(setScale 和 round)返回一个 BigDecimal,其值大约(或完全)等于操作数的值,但其比例或精度是指定值;也就是说,它们增加或减少存储数字的精度,而对其值的影响最小。小数点运动操作(movePointLeft 和 movePointRight)返回一个 BigDecimal,它是通过将小数点沿指定方向移动指定距离而从操作数创建的。

为了简洁和清晰,在 BigDecimal 方法的整个描述中使用了伪代码。 伪代码表达式 (i + j) 是“一个 BigDecimal,其值是 i 添加到 BigDecimal j 的 BigDecimal 的值”的简写。 伪代码表达式 (i == j) 是“当且仅当 BigDecimal i 表示与 BigDecimal j 相同的值时才为真”的简写。 其他伪代码表达式的解释类似。 方括号用于表示定义 BigDecimal 值的特定 BigInteger 和比例对; 例如 [19, 2] 是 BigDecimal,数值上等于 0.19,尺度为 2。
注意:如果 BigDecimal 对象用作 SortedMap 中的键或 SortedSet 中的元素,则应小心,因为 BigDecimal 的自然顺序与 equals 不一致。 有关更多信息,请参阅 Comparable、java.util.SortedMap 或 java.util.SortedSet。

public calss 
BigDecimal extends Number implements Comparable<BigDecimal>{
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值