1. BigDecimal为什么可以精度不丢失?
BigDecimal
之所以能够保持精度不丢失,主要是因为它的实现方式和数据存储结构与其他浮点数类型(如 float
和 double
)不同。
BigDecimal
通过一个 整数数组 和一个整数 标度(scale)来表示数值。标度代表了小数点的位置,整数数组存储了数值的精确值。
比如,数字1.234
可以表示为1234
和10^3
的形式(即1234 * 10^(-3)
)。这种表示方式可以避免二进制浮点数中的精度损失,确保数字的准确性。
2. 线程池中的任务抛出了异常会怎样?此时,运行线程会被销毁吗?
在 Java 中,线程池中的任务抛出异常时,线程池的行为取决于任务执行时发生异常的位置以及线程池的配置。
1. 任务中的异常处理
如果线程池中的任务在执行过程中抛出异常,线程池本身并不会捕获任务中的异常,而是将异常抛给任务的调用者。如果任务是通过 submit()
提交的,它返回一个 Future
对象,异常可以通过 Future.get()
方法获取。
-
使用
Runnable
提交的任务:如果任务抛出异常,线程池的执行线程会把异常信息打印到控制台,停止当前任务的执行。 -
使用
Callable
提交的任务:如果任务抛出异常,线程池中的执行线程也会停止当前任务的执行,不会打印异常,会把异常封装给Future,在future.get()结果时才打印异常。
2. 线程抛出了异常,这个线程会怎么处理?
当线程池中的任务执行异常时,该任务的执行线程会正常结束任务的运行,并且该线程会回到线程池中准备承接其他任务的执行。这与任务正常执行完成的情况是一样的。线程池中的线程是复用的,它们并不会因为某个任务抛出异常而被销毁或停止工作,而是继续等待新的任务。
final void runWorker(Worker w) {Thread wt = Thread.currentThread();