2019-08-12 线程2

实现Callable接口:可以定义回调接口;     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资源去执行其他的资源;

你可能感兴趣的:(2019-08-12 线程2)