1. 线程的状态
public enum Thread.State {
NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED;
}
2. yield vs wait
yield和sleep一样,调用之后线程转入RUNNABLE状态;而wait调用之后,线程则转入WAIT或TIMED_WAITING状态。
同样,yiled也没有让出锁,只是让出了此时的执行权。别的线程可以执行。
而wait则是让出了锁,只有别的线程调用了锁的notify之后,当前线程才会获得锁继续执行。
3. tryLock
某些锁,如ReentrantLock提供tryLock方法,其含义是如果没有线程持有该锁,则当前线程获得该锁;如果有线程已获得该锁,则当前线程立即返回。
4. Condition的实现
await时,将当前线程加入到等待队列中,并释放当前线程的锁,激活处在等待队列中的下一个线程。
5. Timer的缺陷以及替代品ScheduledThreadPoolExecutor
Timer在执行任务时只创建一个线程,如果该任务执行时间比较长,势必会影响下一个任务的执行。所以现在普遍用ScheduledThreadPoolExecutor来替代。
6. 方法的synchronized属性不可继承
父类方法设置了synchronized属性,子类override了这个方法,如果没有标明synchronized,那么子类的这个方法也不是同步的。
7. 捕获线程异常
针对某个线程:
Thread thread = new Thread(new Runnable(){
@Override
public void run()
{
int a=1/0;
}
});
thread.setUncaughtExceptionHandler(new UncaughtExceptionHandler(){
@Override
public void uncaughtException(Thread t, Throwable e)
{
System.out.println("线程:"+t.getName()+" 出现了异常:"+e.getMessage());
}
});
thread.start();
针对所有线程:
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler(){
@Override
public void uncaughtException(Thread t, Throwable e)
{
System.out.println("线程:"+t.getName()+" 出现了异常:"+e.getMessage());
}
});
8. Exchanger,线程间交换数据
一个线程调用exchange方法之后进入等待状态,直至另外一个线程也调用了exchange方法。