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 BETWEEN操作符 语法
    mysql IN操作符 语法
    mysql LIKE通配符 语法
    mysql TOP语句 语法
    mysql DELETE语句 语法
    mysql Update语句 语法
    mysql INSERT语句 语法
    mysql ORDER BY语句 语法
    mysql OR运算符 语法
    mysql AND运算符 语法
  • 原文地址:https://www.cnblogs.com/levin180425/p/11349105.html
Copyright © 2011-2022 走看看