多线程-基础方法的认识
截止目前线程的复习
Thread 类
创建Thread类的方法
- 继承Thread类,重写run方法
- 实现Runnable接口,重写run方法
- 使用匿名内部类继承Thread类,重写run方法
- 使用匿名内部类实现Runnable接口,重写run方法
- 使用Lambda表达式
run方法中的所有的代码是当前线程对象需要实现的逻辑,也就是线程需要做的工作.线程的真正的开始运行,是在主线程中使用线程对象调用了start方法
中断线程的方式
- 自己在线程中定义一个标志位,然后在外部实现对线程自定义的中断的规则
- 使用标准库中自带的标志位 isInterrupted()方法判定,然后使用interrupt()方法在外部实现对线程自定义中断的规则然后进行触发中断
(使用interrupt()方法进行触发中断的条件下,还和当前线程的状态的关系有关,如果当前的线程对象是出于Runnable状态,那么调用interrupt() 方法会设置标志位,也就是把线程给中断了; 如果当前的线程是出于阻塞(sleep/wait)状态,那么此时表面是没有设置标志位,但是在源码中的确是设置了标志位,但是后面又消除了)
线程等待
- join()方法
在main 方法中调用了这个方法 : 线程对象t.join()
这个意思是main线程和线程t同时开始,但是main线程一旦调用了上述的方法,那么此时开始main线程必须等线程t执行完之后再继续执行后续的逻辑.此时的mian线程(调用者)陷入了阻塞状态
线程休眠
- sleep()方法
sleep(时间参数) ,该方法是在Thread类中的静态方法,在什么线程中的run方法中调用,那么当前线程对象就会休眠,而休眠的时间就是该方法的参数(单位是ms毫秒)
获取线程的对象
- CurrentThread() 方法
这个方法是Thread类中的静态方法,在什么线程调用这个方法,那么获取的就是对应的线程对象. 例如 : 如果我们在一个线程的run方法中使用标准库中自带的标志位来决定线程什么时候结束,那么我们就需要这样实现
Thread thread = new Thread(()->{whilr(!Thread.CurrentThread().isInterrupted()){//在这里实现循环语句中代码的逻辑}});
Java中的线程的状态
状态名 | 描述 |
---|---|
NEW | java中的对象创建出来了,但是内核中的PCB 还没有创建(还没有真正的创建) |
TERMINATED | 内核中的PCB销毁了,但是Thread对象还在 |
RUNNABLE | 就绪状态(正在CPU上运行/在就绪队列中排队) |
TIMED_WAITING | 按照一定的时间进行阻塞,调用sleep |
WAITING | 特殊的阻塞状态,调用waiting |
BLAOKED | 等待锁的时候进入的阻塞状态 |
总结: 整体来说我们的状态大致分为两种: 就绪 + 阻塞 (分别拆分成三种情况)