1.三个非常重要的概念
      程序---->   一组写好了的静态的代码
      进程---->   正在进行着的程序   静态的代码执行起来啦
      线程---->   是进程内的小单元   很多线程同时执行
    2.需要掌握线程的几种不同的状态  及如何切换
       new对象           start()       CPU分配run()    wait()        exception 
      创建线程(对象)----就绪状态----执行状态----等待/挂起----异常/消亡
               |                                    |
               |__________________________|
                      notify/notifyAll
    3.如何实现线程
       自定义一个类
       继承Thread    实现Runnable
       重写run方法
       调用start方法  让线程进入就绪状态  需要注意的是start方法Thread类中

    购票的小例子
    利用Vector集合   线程安全   多个线程并发操作同一个集合的时候  不会抢夺资源
       
    生产消费者模型
    1.通过这个模型  成功的演示出了  线程安全的问题
        两个消费者  同时访问同一个仓库对象   仓库内只有一个元素的时候
        两个消费者并发访问  会有可能产生抢夺资源的问题
    2.自己解决一下线程安全的问题
        让仓库对象被线程访问的时候   仓库对象被锁定
        仓库对象只能被一个线程访问   其他的线程处于等待状态
        特征修饰符
        synchronized  同步  一个时间点只有一个线程访问
        线程安全锁
        两种形式写法
        1.将synchronized关键字 放在方法的结构上
           public synchronized void get(){}
           锁定的是调用方法时的那个对象
        2.将synchronized关键字 方在方法(构造方法 块)的内部  
           public void get(){
            好多代码
            synchronized(对象){
                好多代码
            }
            好多代码
           }
    3.我们觉得return不是很好
        应该让线程的不同状态来回切换
        执行   等待   执行   等待
        wait()    Object类中的方法
        notify  notifyAll   Object类中的方法

        sleep();
        run();
        start();

==================================================================
    比较重要的方法    join---->Thread类
        设计一个模型
        1.有两个线程 One  Two   two加入到one里面
        2.设计模型时候  two线程在one的run里面创建    保证两个有先后顺序
        3.two.join();   无参数==0   有参数==2000
            
        one 启动
        two 启动
        three 启动
        two就join啦
        2000之后  one想要将two从自己的线程内剔除
        two对象不在自己的手里  对象被three线程锁定啦  10000
        one只能等待 threee将two对象释放后 才能踢掉

    synchronized锁 非常的厉害
    一旦对象被锁定  不释放的情况下  其他的对象都需要等待
    有可能会产生一个死锁的效果


JAVA基础---线程基础

 

 

 


 

相关文章: