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

posted @ 2021-05-13 21:36  因心光  阅读(54)  评论(0编辑  收藏  举报