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

  • 相关阅读:
    城市的划入划出效果
    文本溢出省略解决笔记css
    长串英文数字强制折行解决办法css
    Poj 2352 Star
    树状数组(Binary Indexed Trees,二分索引树)
    二叉树的层次遍历
    Uva 107 The Cat in the Hat
    Uva 10336 Rank the Languages
    Uva 536 Tree Recovery
    Uva10701 Pre, in and post
  • 原文地址:https://www.cnblogs.com/forelim/p/14766309.html
Copyright © 2011-2022 走看看