Update Java 并发.md

增加了对FutureTask的详细解释,notify、notifyAll的区别
This commit is contained in:
yezhaodan 2018-06-18 10:09:25 +08:00 committed by GitHub
parent 3252591e4c
commit 8f3dc8ae06
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -670,6 +670,14 @@ after
- wait() 是 Object 的方法,而 sleep() 是 Thread 的静态方法;
- wait() 会释放锁sleep() 不会。
**notify() 和 notifyAll() 的区别**
notify()和notifyAll()都是Object对象用于通知处在等待该对象的线程的方法。两者的最大区别在于
- notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态变成等待该对象上的锁一旦该对象被解锁他们就会去竞争。
- notify则只是选择一个wait状态线程进行通知并使它获得该对象上的锁但不惊动其他同样在等待被该对象notify的线程当第一个线程运行完毕以后释放对象上的锁此时如果该对象没有再次使用notify语句则即便该对象已经空闲其他wait状态等待的线程由于没有得到该对象的通知继续处在wait状态直到这个对象发出一个notify或notifyAll它们等待的是被notify或notifyAll而不是锁。
## await() signal() signalAll()
java.util.concurrent 类库中提供了 Condition 类来实现线程之间的协调,可以在 Condition 上调用 await() 方法使线程等待,其它线程调用 signal() 或 signalAll() 方法唤醒等待的线程。相比于 wait() 这种等待方式await() 可以指定等待的条件,因此更加灵活。
@ -842,8 +850,11 @@ public class FutureTask<V> implements RunnableFuture<V>
```java
public interface RunnableFuture<V> extends Runnable, Future<V>
```
FutureTask使用场景
-FutureTask可用于异步获取执行结果或取消执行任务的场景。通过传入Runnable或者Callable的任务给FutureTask直接调用其run方法或者放入线程池执行之后可以在外部通过FutureTask的get方法异步获取执行结果因此FutureTask非常适合用于耗时的计算主线程可以在完成自己的任务后再去获取结果。另外FutureTask还可以确保即使调用了多次run方法它都只会执行一次Runnable或者Callable任务或者通过cancel取消FutureTask的执行等。
当一个计算任务需要执行很长时间,那么就可以用 FutureTask 来封装这个任务,用一个线程去执行该任务,然后其它线程继续执行其它任务。当需要该任务的计算结果时,再通过 FutureTask 的 get() 方法获取。
```java
public class FutureTaskExample {