|
@@ -8,7 +8,7 @@
|
|
|
|
|
|
同样,`notify()`方法也必须在同步块中使用。如果一个线程在未获得锁的情况下调用`notify()`方法,那么它将无法通知任何等待的线程。因为它没有获取锁,所以它不能访问共享数据或执行必要的同步操作来确保正确的通知。
|
|
|
|
|
|
-因此,使用`wait()`和`notify()`方法时,必须在同步块中使用它们,以确保线程之间的安全性并避免出现竞态条件。
|
|
|
+因此,使用`wait()`和`notify()`方法时,必须在同步q块中使用它们,以确保线程之间的安全性并避免出现竞态条件。
|
|
|
|
|
|
## volatile 关键字
|
|
|
|
|
@@ -158,7 +158,7 @@ AQS提供了一种通用的框架,用于实现线程间的协作和同步操
|
|
|
* **`ThreadPoolExecutor.DiscardPolicy`:** 不处理新任务,直接丢弃掉。
|
|
|
* **`ThreadPoolExecutor.DiscardOldestPolicy`:** 此策略将丢弃最早的未处理的任务请求。
|
|
|
|
|
|
-### 如何设定线程池的大小?
|
|
|
+### 如何设定线程池的大小?(CPU 核心数 - N)
|
|
|
|
|
|
* **CPU 密集型任务(N+1)**
|
|
|
|
|
@@ -171,13 +171,13 @@ CPU 密集型简单理解就是利用 CPU 计算能力的任务比如你在内
|
|
|
* Future类的get方法
|
|
|
|
|
|
```java
|
|
|
-private static final int NEW = 0;
|
|
|
-private static final int COMPLETING = 1;
|
|
|
-private static final int NORMAL = 2;
|
|
|
-private static final int EXCEPTIONAL = 3;
|
|
|
-private static final int CANCELLED = 4;
|
|
|
-private static final int INTERRUPTING = 5;
|
|
|
-private static final int INTERRUPTED = 6;
|
|
|
+private static final int NEW = 0; // 初始状态,FutureTask刚被创建,正在计算中都是该状态。
|
|
|
+private static final int COMPLETING = 1; // 中间状态,表示计算已完成正在对结果进行赋值,或正在处理异常
|
|
|
+private static final int NORMAL = 2; // 终止状态,表示计算已完成,结果已经被赋值。
|
|
|
+private static final int EXCEPTIONAL = 3; // 终止状态,表示计算过程已经被异常打断。
|
|
|
+private static final int CANCELLED = 4; // 终止状态,表示计算过程已经被cancel操作终止。
|
|
|
+private static final int INTERRUPTING = 5; // 中间状态,表示计算过程已开始并且被中断,正在修改状态。
|
|
|
+private static final int INTERRUPTED = 6; // 终止状态,表示计算过程已开始并且被中断,目前已完全停止。
|
|
|
|
|
|
public V get() throws InterruptedException, ExecutionException {
|
|
|
int s = state;
|