线程的中断
线程中断(终止)的两种情况:
1. 执行到了run方法的最后一条语句后,并执行return返回时。
2. 由于出现了未捕获的异常。
没有可以强制中断线程的方法,然而interrupt
可以请求终止线程。
调用interrupt
将线程的中断状态置位。
调用isInterrupt
判断线程是否为中断状态。
如果线程被阻塞,那么无法进行判断,产生一个InterruptException
异常。
Thread.Interrupted ----> Thread.currentThread().isInterrupted(true)
检测当前线程是否中断。
默认的isInterrupted()----->isInterrupted(false)
。
线程的状态
- new
- runnable
- blocked
- waiting
- timed waiting
- terminated
调用getState()
获取线程的状态。
线程属性
- 优先级:默认NORM_PRIORITY = 5,MIN_PRIORITY = 1,MAX_PRIORITY = 10;
- 守护线程:用途是为其他线程提供服务。 3.
锁对象
Lock myLock = new ReentrantLock();
myLock.lock();
try{
....
}finally{
myLock.unlock();
}
不能使用带资源的try语句。记得解锁。
条件对象
Condition condition = new ReentrantLock().newCondition();
condition.await();
condition.signAll();
condition.sign();
sychronized
public synchronized void method(){...};
------------------------------------>
public void method(){
this.intrinsicLock.lock();
try{
...
}finally{
this.intrinsicLock.unlock();
}
}
synchronized
wait();
notifyAll();
notify();
监视器
监视器特性:
1. 监视器只包含私有域的类。
2. 每个监视器类的对象有一个相关的锁。
3. 使用该锁对所有方法进行加锁。
4. 该锁有任意多个相关条件。
java监视器:
1. 域不要求是private。
2. 方法不要求是synchronized。
3. 内部锁对客户是可用的。
4.
Volatile域
同步格言:如果向一个变量写入值,而这个变量接下来可能被另一个线程读取,或者,从一个变量读值,而这个变量可能是之前被另一个线程写的,此时必须使用同步。
volatile关键字为实例域的同步访问提供了一种免锁机制。
原子性
原子操作
AtomicInteger a = new AtomicInteger();
a.incrementAndGet();
锁测试和超时
Boolean b = myLock.tryLock(100,TimeUnit.MILLISECONDS);
myCondition.await(100,TimeUnit.SECONDS);
读/写锁
private ReentranReadWriteLock rwl = new ReentranReadWriteLock();
private Lock readLock = rwl.readLock();
private Lock writeLock = rwl.writeLock;
弃用stop和suspend的原因
试图控制一个给定线程的行为。
阻塞队列
BlockingQueue
接口实现的方法:
方法 | 动作 | 特殊 |
---|---|---|
add | 添加一个元素 | 队列满抛异常IllegalStateException |
element | 返回队列的头元素 | 队列空抛异常NoSuchElementException |
offer | 添加一个元素并返回true | 队列满返回false |
peek | 返回队列的头元素 | 空返回null |
poll | 移出并返回队列头元素 | 空返回null |
put | 添加一个元素 | 满阻塞 |
remove | 移出并返回头元素 | 空抛异常NoSuchElementException |
take | 移出并返回头元素 | 空阻塞 |
DelayQueue
队列实现Delay
接口
interface Delayed extends Comparable<Delayed>{
long getDelay(TimeUnit unit);
}
getDelay
方法返回对象的残留延迟。负值表示延迟已经结束。元素只有在延迟用完的情况才能从DelayQueue
中移除。
TransferQueue
接口,允许生产者线程等待,直到消费者准备就绪可以接受一个元素。
Callable和Future
Callable
有返回值,是一个参数化类型的接口,只有一个方法call
public interface Callable<V>{
V call() throws Exception;
}
Future
保存异步计算的结果,直到计算完成。
public interface Future<V>{
V get() throws...;
V get(long timeout,TimeUnit unit) throws ...;
void cancel(boolean mayInterrupt);
boolean isCancelled();
boolean isDone();
}
执行器
Executor
类有许多静态工厂方法用来构建线程池。
方法 | 描述 |
---|---|
newCachedThreadPool | 必要时创建新线程,空闲线程保留60秒 |
newFixedThreadPool | 该池包含固定数量的线程;空闲线程会一直保留 |
newSingleThreadExecutor | 只有一个线程的池,该线程顺序执行每一个提交的任务 |
newScheduledThreadPool | 用于预定执行而构建的固定线程池 |
newSingleThreadScheduledExecutor | 用于预定执行而构建的单线程池 |
shutdownNow
:取消所有的任务
invokeAny
:提交所有对象到一个Callable对象的集合中,并返回某个已经完成了任务的结果。
invokeAll
:提交所有对象到一个Callable对象的集合中,并返回一个Future对象的列表,代表所有任务的解决方案。
同步器
类 | 作用 | 说明 |
---|---|---|
CyclicBarrier | 允许线程集等待直至其中预定数目的线程到达一个公共barrier,然后可以选择执行一个处理barrier的动作 | 当大量的线程需要在他们的结果可用之前完成时 |
Phaser | 类似于循环barrier,不过有一个可变的计数 | |
CountDownLatch | 允许线程等待到计数器减为0 | 当一个或多个线程需要等待直到指定数目的事件发生 |
Exchanger | 允许两个线程在要交换的对象准备好时交换对象 | 当两个线程工作在同一个数据结构的两个实例上的时候,一个向实例添加数据而另一个从实例清除数据 |
Semaphore | 允许线程集等待直到被允许继续运行为止 | 限制访问资源的线程总数。如果许可数为1,常常阻塞线程直到另一个线程给出许可为止 |
SynchronousQueue | 允许一个线程把对象交给另一个线程 | 在没有显式同步的情况下,当两个线程准备好将一个对象从一个线程传递到另一个时 |