zoukankan      html  css  js  c++  java
  • Java中的线程

    线程的定义

      线程 - 进程中的进程,就是线程,使用java实现的并发,线程也是java程序执行的最小单位,我们通常使用的main方法就是一个线程;

    线程的创建

      1.继承Thread父类,重写run方法。启动线程使用start方法;

      2.实现Runnable接口,实现run方法,创建Thread对象,使用对象调用start方法;

    线程一旦启动,和启动它的线程就是两个完全独立的运行单元,谁先执行谁后执行取决于谁能抢到CPU资源;

    线程的同步问题 - 当多个线程并发访问一个共享资源(对象)的时候,有可能引发同步问题;

      例如:火车代售票点

    线程同步问题

    解决多线程同步问题 - 锁机制 - 就是给共享资源加锁;(排他锁)

      第一种方法 - 互斥

        synchronized关键字 - 给对象加锁;

          1、放在方法定义前面 - public synchronized void f(){  // - 加锁

                                                                                                //需要同步的代码

                                                                                   } // - 解锁

                  优点:简单易懂;

                  缺点:无论是否需要同步的代码都串行,效率低;

          2、synchronized 块 -  synchronized (需要被加锁对象){ // - 加锁

                                                                                                //需要同步执行的代码

                                                                                   } // - 解锁

                  优点:需要同步的代码块同步执行,不需要同步的代码可以并发执行,这样提高运行效率;

                   缺点:不好理解;

      第二种方法 - 协作

        生产者 - 消费者模型 - 产品(共享资源) :

        生产者在生产产品之前,消费者不能消费,消费者在消费完产品之前,生产者不能生产;

          wait(); - 等待

          notify();notifyAll();- 通知(所有)

        例如 :麦当劳免费续杯;

      它是实现线程池、数据库连接池、高速缓存等的主要思想;

    线程的状态

      线程五个状态 - 1.新建状态 - 线程对象已经建立,但是没有调用start方法之前;

             2.就绪状态 - 调用start方法后,会进入就绪队列中;等待cpu;(线程调度程序)

             3.执行状态 - 线程调度程序分配cpu资源后,线程执行;

             4.阻塞状态 - 当调用wait、sleep方法,或进行IO操作,等待网络连接请求等;

             5.死亡状态 - a)自然死亡 - run方法执行完毕,程序正常结束;

                    b)突然死亡 - 在线程执行过程中,调用stop、interrupt方法时,强制线程终止;

    总结

      思考:wait和sleep方法的区别?

          1.sleep方法设定了一个时间,当时间到的时候,线程会自动被唤醒进入就绪状态;wait只有被notify才能被唤醒;

          2.sleep方法是Thread类的静态方法,而wait是Object提供的,所有的java类都能调用它;

          3.sleep方法的调用是不需要锁的,而wait方法的调用是需要锁的,并且在调用完以后还会解锁;

  • 相关阅读:
    Python模块、包、异常、文件(案例)
    jQuery DataTable 删除数据后重新加载
    Python|面向对象
    python开发的学生管理系统
    使用JDK开发WebServrice案例
    Python入门(案例)
    Spring总结以及在面试中的一些问题
    Web Services简单介绍
    Canvas实现文字粒子化,并且绕轴旋转(完善)
    HTML5 Canvas画数字时钟
  • 原文地址:https://www.cnblogs.com/coffeerun/p/5753340.html
Copyright © 2011-2022 走看看