多线程(day13)

来源:互联网 发布:js获取translatey的值 编辑:程序博客网 时间:2024/05/02 04:27


第十三天  多线程
360safe.exe 进程   Feiq.exe  QQ.exe  eclipse.exe
进程,就是应用程序在运行过程中占有的内存空间
360中的体检,木马,漏洞这些功能都在同时执行 由CPU来执行
定义::这些运行不同功能代码的执行路径,控制单元,就是线程
每一个应用程序,至少有一个活的线程,否则应用程序将推出
现在的java程序,单线程,main,一致执行到底
有没有main执行后,程序可以单独在开始另一个执行路径,和main脱离出来
1. java语言对多线程的支持
  我们不能直接创建线程的,必须依靠JVM帮助我们完成创建线程的功能
  JVM也不能创建线程,依靠window操作系统,来创建线程
  为我们提供了描述多线程的对象  Thread  java.lang
  Java 虚拟机允许应用程序并发地运行多个执行线程。
2. 如何创建线程 第一种
       声明一个类,继承Thread类,并覆盖run方法
       建立子类的对象,相当于创建了一个线程
       如何开启和运行线程,需要调用线程的start()方法
       start()启动一个线程,JVM调用线程的run()方法
       为什么继承Thread 覆盖run方法
        继承Thread,子类变成了线程类
       覆盖run方法,java工程师,后期不知道线程要运行的代码是什么
        提供了一个方法,让你来覆盖run,覆盖后,JVM会自动的调用线程的run
3. JVM是单线程还是多线程---多线程的程序
      一个线程执行我们写的代码
      一个线程执行垃圾回收
      一个线程使用window系统中的资源
线程的状态图
5. 卖票的实例*****  引出来第二种创建线程的方式,和线程操作共享数据的安全隐患
       获取线程名字的方法 Thread类,getName()
       设置线程的名称 Thread setName(String name)
      获取线程名字的方法 利用Thread类中的一个静态方法 currentThread()
      currentThread() 运算的结果是,当前正在运行的线程对象 
      static Thread currentThread(){}
6. 第二个创建线程的方式  实现Runnable接口
      定义类,实现Runnable接口
      覆盖接口的抽象方法 run
      建立Thread对象,在Thread构造方法中,传递Runnable接口的实现类对象
      调用Thread对象start()方法
7. 继承Thread和实现Runnable接口的区别
     继承,单继承的局限性
     实现接口,多实现
     继承的方式,资源线程独享
     实现Runnable接口,资源线程共享,(票对象,只有一个)
8. 多线程操作共享数据的安全隐患
    当多个线程,操作同一共享数据的是,存在安全隐患
    也是开发多线程程序中,最头疼的问题
    程序人员,必须保证数据的准确性
     解决多线程操作共享数据的安全问题,使用同步技术来解决问题
      同步技术,当线程去操作数据的时候,一个线程不操作完毕,其余的线程无法进行操作
      同步代码块:格式
         synchronized(对象){
     //线程操作的共享数据
  }
        保证多线程运行,持有锁的线程才能运行,没有锁的线程,只能等待,临时阻塞
    利用同步解决了卖票过程中的数据安全问题
9. 银行的存钱案例 *****
 每个窗口存3次,2个窗口
 每次存款 100元 一共600
     当线程操作的数据,在方法内,全部都是操作的共享数据,同步方法可以了
      不在需要些单独的同步代码块了
     非静态同步方法的锁,也是对象,是本对象的引用 this
       静态方法的锁,是类名.class 返回的字节码文件对象
10. 单例设计模式中,懒汉中的安全隐患,解决办法
    保证对象的唯一性 懒汉中,由于延迟加载对象,造成数据安全问题
    多线程,操作同一个单例设计类的时候
    解决办法:安全的高效的懒汉
11. 死锁***** 面试
     是多线程的一个特性,实际项目中,不可能出现
     多个线程抢一把锁,造成程序终止运行,停止了,但是程序并没有结束
     给我筷子,给我叉子
     出现的原因,同步中,还有同步  嵌套同步 (嵌套for循环)