Java多线程基础学习

来源:互联网 发布:php棋牌游戏源码下载 编辑:程序博客网 时间:2024/05/22 06:39

1、程序(program)是为了完成特定任务、用某种语言编写的一组指定集合。即一段静态代码,静态对象

2、进程(process)是程序的一次执行过程,或是正在运行的一个程序。动态过程:有它自身的产生、存在和消亡过程(程序是静态的、进程是动态的)

3、线程(thread):进行可以进一步细化为线程,是一个程序内部的一条执行路径

      若一个程序可以同一时间执行多个线程,就是支持多线程的

4、多线程的创建和启动:

      Java语言的JVM允许程序运行多个线程,他通过java.lang.Thread类来实现的。

      Thread类的特征:

          每个线程都是通过某个特定Thread对象的run()方法来完成操作的,经常把run()方法的主体称为线程体

          通过该Thread对象的start()方法来调用这个线程(一个对象只能执行一次start()方法)

5、Thread的常用方法:

      ①  start() 启动线程并执行相应的run()方法

      ②  run() 子线程要执行的代码放入run() 方法中

      ③  currentThread() 静态的,调取当前的线程

      ④  getName() 获取此线程的名字

      ⑤  setName() 设置此线程的名字

      ⑥  yield() 调用此方法的线程释放当前CPU的执行权(但可直接参与CPU执行权竞争)

      ⑦  join() 在A线程中调用B线程的join()方法,表示,当执行此方法,A线程停止执行,直至B线程执行完毕,A线程再接着join()之后的代码执行

      ⑧  isAlive()  判断该线程是否还存活

      ⑨  sleep(long l)  显示的让当前线程睡眠l 毫秒(1000毫秒=1秒)

      ⑩  线程通信:wait()      notify()    notifyAll()

6、线程的调度:

      调度策略

          时间片

          抢占式:高优先级的线程抢占CPU

      Java的调度方法:

          同优先级线程组成先进先出队列(先到先服务),使用时间片策略

          对高级优先级,使用优先调度的抢占式策略

7、线程的优先级:

      线程的优先级控制:

  • MAX_PRIORITY(10)  常量
  • MIN_PRIORITY(1)
  • NORM_PRIORITY(5)

涉及的方法:

  • getPriority() : 返回线程优先值
  • setPriority(int newPriority) :  改变线程的优先级
  • 线程创建时继承父线程的优先级

8、创建多线程的方式二,通过实现的方式:

      ① 创建一个实现了Runnable接口的类

      ②  实现接口的抽象方法

      ③   创建一个Runnable接口实现类的对象

      ④  

9、对比一下继承方式和 实现方式

      ① 联系:Thread本身就是实现Runnable接口

      ② 实现的方式优于继承的方式:

           实现方式避免了Java单继承的局限性

           如果多个线程要操作同一份资源(数据)更适合使用实现的方式

10、使用多线程的优点:

        ① 提高应用程序的响应。对图形化界面更有意义,可增强用户体验

        ② 提高计算机系统CPU的利用率

        ③ 改善程序结构。将既长又复杂的进程分为多个线程,独立运行,利于理解和修改

11、线程的分类:

        Java中的线程分为两类:一种是守护线程,一种是用户线程

        ① 他们几乎每一个方面都是相同的,唯一的区别是判断JVM何时离开

        ② 守护线程是用来服务用户线程的,通过在start()方法前调用Thread.setDaemon(true)可以把一个用户线程变成守护线程

        ③ Java垃圾回收就是一个典型的守护线程

        ④ 若JVM中都是守护线程,当前JVM将退出

12、线程的生命周期:

        JDK中用Thread.State枚举表示了线程的几种状态

        要想实现多线程,必须在主线程中创建新的线程对象。Java语言使用Thread类及其子类的对象来表示线程,在它的一个完整的生命周期中通常要经历如下五种状态:

         新建:当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处理新建状态

         就绪:处于新建状态的线程被start()后,将进入线程队列等待CPU时间片,此时它具备了运行条件

         运行:当就绪的线程被调度并获得处理器资源时,便进入运行状态,run()方法定义了线程的操作和功能

         阻塞:在某种特殊情况下,被人为挂起或执行输入输出操作时,让出CPU并临时终止自己的执行,进入阻塞状态

         死亡:线程完成了它的全部工作或线程提前强制性地中止

13、Java如何实现线程的安全,线程同步机制

        ① 同步代码块:

              Synchronized(同步监视器){

                    //需要被同步的代码块(即为操作共享数据的代码)

              }

             1、共享数据:多个线程共同操作的同一个数据(变量)

             2、同步监视器:有任何一个类的对象充当,哪个对象获取此监视器,谁就执行大括号里的同步代码

             要求:所有线程必须共同同一把锁(即同一个同步监视器)

             注:在实现方式中,考虑同步的话,可以使用this充当锁,但是在继承的方式中,慎重使用this(因为继承时造的是多个对象,this仅代表当前对象,也就是每一个对象都具备一把锁,无法实现同步)

        ② 同步方法:将操作共享数据的方法声明为synchronized,即此方法为同步方法,能够保证其中一个线程执行此方法,其他线程在外等待直至此线程执行完此方法

             >同步方法的锁,this(默认 )

             注:不能使用在继承Thread中

         线程的同步弊端:由于同一个时间只能有一个线程访问共享数据,速率降低了

14、互斥锁:

        在Java语言中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。

  • 每个对象都对应于一个可称为“互斥锁”标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象
  • 关键字synchronized来与对象的互斥锁联系。当某个对象用synchronized修饰时,表明该对象在任一时刻只能由一个线程访问。
  • 同步的局限性,导致程序的执行效率要降低
  • 同步方法(非静态的)的锁为this
  • 同步方法(静态的)的锁为当前类本身

15、释放锁的操作:

        当前线程的同步方法、同步代码块执行结束

        当前线程在同步代码块、同步方法中遇到break、return终止了该代码块、该方法的继续执行。

        当前线程在同步代码块、同步方法中出现了未处理的Error或Exception,导致异常结束

        当前线程在同步代码块、同步方法中执行了线程对象wait()方法,当前线程暂停,并释放锁

16、不会释放锁的操作:

        线程执行同步代码块或同步方法时,程序调用Thread.sleep()、Thread.yield()方法暂停当前线程的执行

        线程执行同步代码块,其他线程调用了该线程的suspend()方法将该线程挂起,该线程不会释放锁(同步监视器) 

        注:应尽量避免使用suspend() 和 resume() 来控制线程

17、线程的死锁问题:

        死锁:不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁。

        解决方法:

            专门的算法、原则

            尽量减少同步资源的定义

18、线程通信:

        wait() 与 nofity() 和 nofityAll()  (没有定义在Thread中,定义在Object中)

  • wait() : 令当前线程挂起并放弃CPU、同步资源,使别的线程可访问并修改共享资源,而当前线程排队等候再次对资源的访问
  • nofity() : 唤醒正在排队等待同步资源的线程中优先级最高者结束等待
  • nofityAll() : 唤醒正在排队等待资源的所有线程结束等待

java.lang.Object 提供的这三个方法只有在synchronized方法或synchronized代码块中才能使用,否则会报java.lang.IllegalMonitorStateException异常

19、分析:

       ① 是否涉及到多线程的问题?是!生产者、消费者

       ② 是否涉及共享数据?有!考虑线程安全

       ③ 此共享数据时谁?即为产品数量

       ④ 是否涉及线程的通信?存在这个生产者与消费者通信


0 0
原创粉丝点击