zoukankan      html  css  js  c++  java
  • 多线程

    1、需求:要下载两个文件,文件A和文件B要同时下载!如何实现???

    2,进程:正在运行的一个程序就是进程。

    3,线程:程序中独立的执行路径。

    4,进程和线程的案例

      公路:进程

      车道:线程

    5,进程和线程的作用

    进程:用来封装线程并为线程分配资源。

    线程:用来执行代码。

    6,线程的分类

    单线程:程序中只有一条执行路径,同一时间只能干一件事情。

    多线程:程序中有多条执行路径,同一时间可以干多件事情。

    7,开启线程之继承Thread类

    8,主线程和子线程

    1)        什么是主线程

    在程序启动时由JVM自动创建并执行main的线程。

    执行路径:从main方法开始直到main执行完毕。

    2)        什么子线程

    除了主线程以为的所有线程就子线程。

    执行路径:从run方法开始直到run方法执行完毕。

    9,线程的运行模式

    线程是由CPU负责执行。

    1)        分时式模式

    每一个线程平均分配CPU的使用时间。每一个线程分配的时间是相同。

    2)        抢占式模式

    优先级高的线程优先使用CPU,如果优先级相同,则多个线程一起争夺CPU使用权。Java程序多线程属于抢占式模式。

    10,多线程运行的特点和内存分析

    1)        运行特点:随机性

    2)        内存分析

    11,多线程的优点(好处)

    1)        提高了CPU的使用率。

    2)        提高了程序的执行效率。

    11,线程常用方法

    线程常用方法

           * String getName()  获得线程名称。默认命名:Thread-序号,从零开始。

           * void setName(String name) 设置线程名称

           * static void sleep(long millis

                  * 让当前方法执行所在的线程休眠指定的毫秒时间

                  * 单位:毫秒

           * static Thread    currentThread() 

                  * 获得当前方法执行所在的线程对象。

    12,线程的状态

    1)        新建状态

    2)        就绪状态

    3)        运行状态

    4)        阻塞状态

    5)        死亡状态

    13,线程安全

    什么是线程安全

    多个线程同时操作一个共享资源时仍然能得到正确的结果,则称为线程安全。

    15,同步代码块解决线程安全问题

    1)        同步代码块的格式

    synchronized (锁对象) {

           共享资源的代码

    }

    1)        同步代码块的原理

    能够保证同一时间只能有一个线程执行代码块中的代码。

    2)        同步代码块的注意事项

    1)        锁对象可以是任意对象。

    2)        锁对象必须是所有线程共享的对象。

    // 定义变量记录总票数

           public static int tickets = 100;

           // 锁对象

           private static Object lockObj = new Object();

          

           public Tickets(String name) {

                  super(name);

           }

          

           @Override

           public void run() {

                  // 开始卖票

                  while(true) {

                         // 美女B

                         synchronized (lockObj) {

                                // 判断是否还有剩余票数

                                if(tickets > 0) { 

                                       try {

                                              // 休眠下

                                              // 美女A

                                              Thread.sleep(10);

                                              // 卖一张票

                                              System.out.println(getName() + " 卖了一张票,还剩 " + (--tickets) + " 张票");

                                              continue;

                                       } catch (InterruptedException e) {

                                              e.printStackTrace();

                                       }

                                } 

                         }

                         System.out.println("票没了!!!");

    14,同步方法解决线程安全问题

    1)        同步方法的格式

    修饰符 synchronized 返回值类型  方法名(参数列表) {}

    2)        同步方法的原理

    能够保证同一时间只有一个线程调用方法。

    3)        同步方法的锁对象

    如果是非静态同步方法,锁对象是:this

    如果是静态同步方法,锁对象是:类名.class

    4)        同步方法的使用

    15,Lock接口

    JDK1.5新特性。

    1,常用方法

    1)        void lock():获取锁

    2)        void unlock():释放锁

    2,注意事项

    1)        获取锁和释放锁的代码必须成对出现。

    16,线程的实现方式

    1,实现Runnable接口

    1)   实现步骤

    • 创建一个类实现Runnable接口,重写run方法。
    • 创建Runnable实现类对象
    • 根据Thread类对象传递Runnable实现类对象。
    • 调用start方法开启线程。
    • 1)        实现Runnable接口的好处

      • 避免了Java类单继承的局限性。
      • 可以方便多个线程之间共享数据。
      • 线程与任务分离,降低了程序的耦合性。
      • 17,线程池技术
      • 1)        什么是线程池

        • 一个用来创建和管理线程对象的容器。

        2)        为什么要使用线程池

        • 因为创建线程和销毁线程需要消耗大量的CPU资源,如果频繁创建线程和销毁线程会导致效率低,资源浪费。

        3)        线程池的核心思想

        • 线程复用。避免频繁创建线程和销毁线程带来开销。
        • 1)        线程池使用方式

          • 提交Runnable任务
          • 提示Callable任务
          • 1)        线程池常用方法

            void shutdown() 

            销毁线程池对象,会等待线程池中的任务执行完毕才销毁

            void shutdownNow();

            销毁线程池对象,立即销毁线程池,不管线程池中的任务是否执行完毕。

            Future submit(Runnable task) 

            提交runnable任务

            2)        使用线程池的步骤

            • 通过工厂类Executors创建线程池对象并指定线程数量。
            • 调用submit方法提交任务给线程池
            • 调用shutdown方法销毁线程池。 

     

  • 相关阅读:
    MYSQL进阶学习笔记十七:MySQL定期维护!(视频序号:进阶_36)
    MYSQL进阶学习笔记十六:MySQL 监控!(视频序号:进阶_35)
    MYSQL进阶学习笔记十五:MySQL 的账号权限赋予!(视频序号:进阶_33,34)
    MYSQL进阶学习笔记十四:MySQL 应用程序优化!(视频序号:进阶_32)
    学习布局
    接触IT的第一天
    分布视图分页
    单例模式
    js获取URL地址
    View视图传json格式数据到Js
  • 原文地址:https://www.cnblogs.com/levin180425/p/11349105.html
Copyright © 2011-2022 走看看