java基础线程知识

1. 开启线程

  1. 创建执行任务 Runnable

  2. 使用Thread创建线程, Thread构造函数传入 Runnable

  3. 调用start 开启线程

    不要直接调用Thread的run方法,这不会开启线程应该调用start

        new Thread(new Runnable() {
            @Override
            public void run() {
            try{
            	/*
            	逻辑代码
             	*/
            }
            catch (InterruptedException e) {
            
            }

            }
        }).start();

2. 中断线程

	1. 当 run方法执行结束后,经由return 返回,线程自动停止
	2. run方法出现未捕捉的异常
	3. interrupt来主动请求终止线程

终端线程的场景:

​ 当线程运行中,某些条件下需要终止线程,这时候需要不运行线程或者终止线程

​ 本质上interrupt就是把一个标志位置位然后有函数可以在线程内部检查这个标志位

  1. 主动调用线程的interrupt方法来置位标志位

  2. Thread.currentThread().isInterrupted()检测标志位是否被置位

  3. 当线程处于sleep的时候,被interrupt终端,将会抛出InterruptedException异常,标志位清除

  4. 当线程处于interrupt状态,进行sleep调用会将会抛出InterruptedException异常,并且中断标志位会被清除

    如果程序中循环调用sleep就不需要 手动检测 标志位,只需要捕获InterruptedException异常就好了

    1. Thread.currentThread().isInterrupted() 和Thread.interrupted() 区别是前者仅仅检查标志位是否被置位后者 检查的同时会把标志位清空

3. 线程状态

​ 线程有如下几个状态: New Runnable Block wait Timing wait Terminated

  1. New 状态就是 Thread被创建出来

  2. Runnable状态,代表可运行线程,注意这种状态下线程可能运行也可能没在运行,因为线程调度可能没给这个线程时间片让他运行

  3. Block状态,当一个线程试图获取内部的对象锁,这个锁被其他线程持有,线程进入阻塞状态

    当所有线程释放这个锁,并且线程调度器允许本线程持有他,该线程编程非阻塞状态

    1. wait状态,当一个线程等待另一个线程通知调度器一个条件时,该线程进入等待状态

    2. Timing wait状态

    保持收到解除 状态或者 时间到达的时候,线程解除状态

    Thread.sleep Thread.join Lock.tryLock Condition.await的计时版本

    1. Terminated状态

    没有捕获异常

    run方法自然结束

当一个线程被重新激活(时间到了或者拿到锁了),调度器检查它是否比当前允许线程有更高的优先级权限,如果有让线程停止,激活线程开始运行

4. 线程属性

  1. 线程优先级

​ java语言中线程的优先级默认继承自父类

​ 但是注意的是 确定你要更改线程的优先级,因为很可能线程调度器会一直 选择 高优先级的几个线程,让低优先级的线程饿死

  1. 守护线程

    和linux守护进程一样,一直在后台为其他线程提供服务使用,比如计时线程

  2. 未捕获的异常处理器

    在run方法中抛出非受查异常将导致线程停止,不需要任何catch语句来处理传播异常,在线程死亡之前这个异常会被处理到未捕获异常的处理器中

    使用setUncaughtExceptionHandler方法为线程安装一个处理器,也可以使用Thread类的静态方法setDefaultUncaughtException为所有线程安装默认处理器

posted @ 2021-01-26 14:02  make_wheels  阅读(91)  评论(0)    收藏  举报