zoukankan      html  css  js  c++  java
  • 16.线程

    1. 概述
    1. 程序:按照一定逻辑编写的代码集合,储存在硬盘

    2. 进程:正在运行的程序,系统为进程分配内存空间; 进程是资源分配的最小单位

    3. 线程:在进程中独立运行的代码块,一个进程中可以有多个线程;线程是程序执行的最小单位

    4. 进程的特点:

      1. 独立性:进程是系统中独立存在的实体
      2. 动态性:进程是一个正在系统中活动的指令集合
      3. 并发性:多个进程可以在系统中并发执行,不会相互影响
    5. 并发性与并行性

      并发是多个进程快速切换,在宏观上具有多个进程同时执行的效果

      并行是同一时刻,有多条指令在处理器同时执行

    2. 创建调用线程
    1. // 创建方式一
      // 继承 java.lang.Thread;
      public class Thread01 extends Thread{
          // 重写run方法
          @Override
          public void run() {
              super.run();
              // this.getName() 获取线程名称
              System.out.println(this.getName()+"线程执行");
          }
      }
      
      // 对应调用方式一
      public class Test01 {
          public static void main(String[] args) {
              Thread01 thread01 = new Thread01();
              // 给线程赋予名称
              thread01.setName("thread01");
              // start()方法 执行方法
              thread01.start();
          }
      }
      
    2. // 创建方式二
      // 实现Runnable接口
      public class Runable02 implements Runnable{
          // 重写run方法
          @Override
          public void run() {
              System.out.println(Thread.currentThread().getName()+"线程执行");
          }
      }
      
      // 对应调用方式二
      public class Test02 {
          public static void main(String[] args) {
              Runable02 thread02 = new Runable02();
              // 将创建文件
              Thread thread = new Thread(thread02);
              // start()方法 执行方法
              thread.start();
          }
      }
      

    同一个线程运行多次时会抛出异常 IllegalThreadStateException

    3. 线程声明周期
    1. 创建(new)
    2. 就绪(runnable):调用start(),等待cpu调度
    3. 运行(running):抢占到cpu,运行run()
    4. 阻塞(blocked):被暂停执行,可能将资源让给其他线程执行
    5. 死亡(dead):线程销毁
    4. 线程优先级

    线程优先级1-10;十级最优先

    系统默认线程优先级为:5

    尽量不要 设置线程优先级太高1

    getPriority(); // 返回线程的优先级
    setPriority(int); // 设置线程的优先级
    
    5.线程分类
    1. 用户线程(普通线程)

      1. 当程序中还有用户线程时,JVM不会停止
      2. 当程序中仅剩守护线程时,JVM强制停止
    2. 守护线程

      1. 如果所剩线程均为守护线程,JVM强制停止

      2. 守护线程可以在声明时设置

      3. 守护线程一定是在start() 之前设置

        isDaemon() //获取当前线程是否为守护线程
        isDaemon(boolean) // 设置线程是否为守护线程 true为是,false为否    
        
    6.线程休眠sleep
    static void sleep(毫秒数) // 让当前执行的线程休眠指定的时间,	让出cpu,进入阻塞状态
    // interrupt(); 阻塞线程 如果线程休眠中被阻塞 就会出现异常InterruptException    
    
    7. 线程礼让yield
    public class Test03 {
        public static void main(String[] args) {
            // 创建两个线程
            Thread01 thread01 = new Thread01();
            Thread01 thread02 = new Thread01();
            // 给线程名字
            thread01.setName("线程1");
            thread02.setName("线程2");
            // 启动线程
            thread01.start();
            thread02.start();
            // 线程让出 暂停现在执行的线程,重新回到就绪状态抢线程
            Thread.yield();
        }
    }
    
    8. 线程加入join

    join() 等待此等待此线程终止

    // 一般用于主线程需要用到子线程数据,于是调用子线程的join()等待子线程完成
    public final void join() throws InterruptedException {
       join(0);
    }
    
    9. 线程同步
    1. 线程并发:多个线程同时修改同一对象或数据时,容易出现线程并发

    2. 解决方法:添加同步锁,完成线程同步,延长时间,以效率为代价保证数据安全性,java中任何对象都可以作为锁对象

    锁是控制线程对共享资源进行访问的工具,通常,锁提供了对资源的独占访问

    // 对象必须是同一个
    synchronized (Object) {
        // 代码块
    }
    

    image

  • 相关阅读:
    抓取用户openid
    getaccesstoken方法
    https_request请求接口返回数据
    composer安装
    Linux下mysql数据库root无法登录的情况
    nginx安装
    shell脚本采用crontab定时备份数据库日志
    Python之元类详细解析
    Python面向对象之封装、property特性、绑定方法与非绑定方法
    Python之面向对象的组合、多态、菱形问题、子类中重用父类的两种方式
  • 原文地址:https://www.cnblogs.com/forelim/p/14766309.html
Copyright © 2011-2022 走看看