java核心技术笔记--线程

线程的中断

线程中断(终止)的两种情况:
1. 执行到了run方法的最后一条语句后,并执行return返回时。
2. 由于出现了未捕获的异常。

没有可以强制中断线程的方法,然而interrupt可以请求终止线程。

调用interrupt将线程的中断状态置位。

调用isInterrupt判断线程是否为中断状态。

如果线程被阻塞,那么无法进行判断,产生一个InterruptException异常。

Thread.Interrupted ----> Thread.currentThread().isInterrupted(true)检测当前线程是否中断。
默认的isInterrupted()----->isInterrupted(false)

线程的状态

  1. new
  2. runnable
  3. blocked
  4. waiting
  5. timed waiting
  6. terminated

调用getState()获取线程的状态。

线程属性

  1. 优先级:默认NORM_PRIORITY = 5,MIN_PRIORITY = 1,MAX_PRIORITY = 10;
  2. 守护线程:用途是为其他线程提供服务。
  3. 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 允许一个线程把对象交给另一个线程 在没有显式同步的情况下,当两个线程准备好将一个对象从一个线程传递到另一个时

猜你喜欢

转载自blog.csdn.net/sayWhat_sayHello/article/details/80986880