实现Callable<T>接口:可以定义回调接口; T Call();
一个线程创建之后一般都是就绪,很低概率会出现直接运行状态;
消亡: 出eroor 或者正常情况死亡;
线程同步锁:一个线程拿到了锁,那么就其他的线程都会处于阻塞状态;
程序如果发生异常【Exception】 线程会消亡;
并发访问 和线程同步;
1. 单例模式:
public class Util {
private static final Util U= new Util();//在类中已经创建了对象;
private Util() {
}
public Util getUtil() {
return u;
}
}
线程安全问题 : 在多线程环境中,多个线程在执行同一段代码的时候,带来的结果和需求【预期】不一致;
解决方案: java 中通过锁机制保证线程安全: 关键字:synchronized (锁对象) { // 多个线程要同步执行的 代码块 }
2. 使用同步之后的后果: 使用同步保证了线程的安全,但是降低了效率;
集合: list 不安全 vector 安全;
3.规则 : 为了提高效率,在代码中尽量不要将整个方法的所有的代码都用synchronize,一般都是将共享的代码加锁;
锁对象: 在JAVA中 任意的一个对象 都可以作为synchronize 的锁对象【官方:监视器】; 但是如果多个线程获取到的锁对象不一致,那么同步机制会失效; 用枚举去当锁对象,这样就不会出现换锁的情况;
同步代码块: 使用synchronized 结构 将要同步的代码包裹起来;
同步方法: 当synchronized代码块中的包含的是 整个方法中额代码,此时可以定义为同步方法; 同步方法具有隐式的锁对象; 非静态的同步方法锁对象式 this ,静态同步方法的锁对象式当前类的Class对象;
用this 可能会出现问题; 不是同一个对象; 实现接口 而不是继承类;
public synchroinze
线程之间 的通信以及 等待唤醒机制:
需求: 生产者消费者的问题: 定义一个容器 : 容器里面存放的式Book的对象;
生产一本书就卖一本书,如果有书就不生产,没有就不卖;
1.定义book 类;
2.定义容器-List
3.两个线程: 生产书的线程,卖书的线程;
4.两个线程操作同一个资源: List 两个要同步;
5.两个线程要通讯,wait,notify【只能唤醒一个】 ,notifyall【只能唤醒拥有相同锁对象的在等待(阻塞状态中的)】 方法;
----------- 前提是有同步; 而且必须放在同步代码块中;上述方法必须由锁对象调用;
---- 当有书的时候,生产线程等待, 通知消费者线程消费;
当没有书的时候,消费者线程等待,通知生产者线程 生产;
注意: 多线程通信的前提:
1.多线程:
2.操作同一个资源;
3.必须要有同步,所有线程的多对象都是同一个;
4. wait.notify, notifyAll 方法必须在同步代码块中执行;
.死锁线程 : 锁套锁必定会死锁; 拿到锁之后才会释放锁;
2. 死锁的解决方案: 避免死锁;
线程控制:
1.设置线程优先级 ,只能增大调用概率;
2. 线程的优先级在等待唤醒机制中:在唤醒等待的线程时,只能唤醒优先级比当前线程高的;
3.join : 线程调用JOIN ,导致其他线程等待,当前线程占用cpu资源优先执行,当当前线程执行完成或者join 方法中参数表示的时间结束,让出CPU资源去执行其他的资源;
网友评论