1. JDK1.5新特性Lock接口
互斥锁:private static Lock lockObj = new ReentrantLock();
lock():获取锁 unlock():释放锁
当锁住的代码出现异常时,不会自动释放锁,必须调用unlock()方法释放。
2. 开启线程之实现Runnable接口
3.匿名内部类实现线程程序
前提:继承父类或者接口实现
new 接口或父类(){
// 重写方法
}
4.线程池使用之提交Runnable任务
线程池使用之提交Callable任务
5.线程死锁:指两个或多个线程之间因争夺资源而造成一种相互等待的现象就称为线程死锁
死锁产生的四个条件:
互斥条件:一个资源同一时间只能被一个线程使用。
* 请求与保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放。
* 不可剥夺条件:线程已获得的资源,在末使用完之前,不能强行剥夺。
* 循环等待条件:线程之间形成循环等待资源关系。
6.线程间通讯
wait():等待,让当前正在执行任务的线程释放CPU的使用权。当前线程进入阻塞状态。
notify():唤醒 唤醒阻塞状态的线程,让其进入就绪状态。随机唤醒一个。
notifyAll():唤醒全部处于阻塞状态的线程。进入就绪状态。
注:以上三个方法必须由锁对象调用。
Runnable和Callable有什么不同?
* Runnable接口的run方法没有返回值,不能声明抛出异常。
* Callable接口的call方法有返回值,可以声明抛异常
* sleep()和wait()的区别
* 都可以让线程进入阻塞状态。
* sleep需要执行时间,wait()可以指定也可以不指定。
* sleep不会释放锁对象,wait()会释放锁对象。
* sleep方法可以在任何地方调用。wait方法必须在同步方法或同步代码块中调用,必须由锁对象调用。
Lock和synchronized区别
* Lock是JDK1.5出现的,是一个接口。synchronized是一个关键字。
* synchronized在代码块或方法执行完毕之后会自动释放锁。
* Lock在执行完相关代码时必须调用unlock方法进行释放锁。
* synchronized出现异常时也会自动释放锁。而Lock接口在出现异常时不会自动释放锁,一般需要在finally中调用unlock方法保存锁对象能够被释放。
* Lock是面向对象的思维。
* 如果资源竞争很激烈的时,Lock接口的性能会比synchronized性能好很多。