java 多线程
- 线程的状态:New、Runnable、Blocked、Waiting、Timed waiting、Terminated
new Thread()——> New、 start()——> Runnable、 等待资源——>Blocked、wait()——> waiting 等
- 锁:ReentrantLock, 条件对象:Condition
- synchronized
每个Object对象都有一个内部锁,synchronized关键字实际使用的就是内部锁,直接使用的wait()方法实际使用的是对象内部锁的条件。
wait()——notifyAll——notify 对应 Condition.await()——Condition.signalAll()——Condition.signal()
synchronized(obj){......} 获取的是obj的内部锁
- Volatile
1. 修饰变量可见性,即主内存和工作内存同步
2. 阻止相关字节码重排序
- new ThreadLocal<T>(){ T initialValue(){}} 为每个线程构造其局部对象
- tryLock() 申请一个锁,成功返回true,否则立即返回false。可以传入超时参数
- ReentrantReadWriteLock 读写锁,多线程读,少线程写很有用。拆分成读锁 readLock()和写锁writeLock()使用。
- 阻塞队列 通过队列的方式分成生产线程和消费线程
- java.util.concurrent 包中包含线程安全的集合,例如ConcurrentHashMap、ConcurrentLinkedQueue等
- Callable and Future
Callable 区别于Runnable, 其可以返回计算结果Future对象,也可以抛出异常。
可以用 FutureTask包装Callable接口的对象,即
Callable<Integer> myComputation = ...;
FutureTask<Integer> task = new FutureTask<Integer>(myComputation);
Thread t = new Thread(task);
t.start();
....;
Integer result = task.get();
- 线程池
Executor类工厂方法 :
newCachedThreadPool() | 必要时创建新线程,空闲线程保留60秒 |
newFixedThreadPool() | 该池包含固定数量的线程,空闲线程会一直保留 |
newSingleThreadExecutor() | 只有一个线程的池,顺序执行每一个提交的任务 |
newScheduledThreadPool | 用于预定执行而构建的固定线程池,代替java.util.Timer |
newSingleThreadScheduledExecutor() | 用于预定执行而构建的单线程池 |
前三个返回实现了ExecutorService接口的ThreadPoolExecutor对象,使用submit(Runnable)或submit(Callable)提交任务
后两个返回实现ScheduledExecutorService接口的对象,可以定时或周期执行任务。
- 控制任务组 ExecutorCompletionService
- Fork-Join框架