当前位置: 首页 > 科技观察

一张图看懂Java多线程

时间:2023-03-16 21:39:12 科技观察

1。疑惑看图1)竞争对象的锁和竞争CPU资源以及竞争被唤醒2)什么情况下获取锁,什么情况下释放锁2,还是那张图3,详细illustration1)Threadt=newThread(),初始化一个线程,其实就是一个普通的对象,它的状态是New2)t.start();线程处于就绪状态(canRunning状态),也就是随时等待运行,不要小看这个start,这个start决定了它是否是一个真正的线程实例,因为start为它准备了一个线程环境,如果你只是正常调用run方法,那么这是一个常用的方法。这个时候的线程都会去竞争CPU资源,所以谁在竞争CPU资源,也就是Scheduler,谁就可以从runnable状态进入到真正的running状态。3)当线程获得CPU资源后,线程从可运行状态进入真正的运行状态,即Running。毫无疑问,它现在正在运行。4)如果线程正在等待客户输入学习,即IO异常,等阻塞事件,也可能会调用sleep等阻塞事件,线程会从运行状态变为阻塞状态,而这状态不会发生。任何事物!5)一旦阻塞事件被清除,例如用户完成输入、IO流关闭、sleep超时等,线程从阻塞状态变为就绪状态,并返回再次进入可运行状态,随时与其他线程争夺资源。等着跑!6)处于运行状态的线程在运行过程中可能会遇到同步方法或同步块,即标有synchronized的方法或块。此时线程获得了对象的锁,其他线程无法进入同步方法。那么这些不能执行的线程呢?它们都阻塞在这里,等待锁的释放,重新竞争锁资源,因为只有拥有锁的线程才有资格继续运行,那么这些线程就阻塞在锁池(LockPool)中.7)一旦被阻塞在锁池中的线程竞争锁(前一个线程用完或者前一个线程在内部用完异常,或者调用wait等,线程锁就会被释放),那么该线程就会被从阻塞态转为就绪态,不要认为这个线程会马上执行,这是不可能的,你要认为线程执行必须要获取CPU资源,如果没有操作系统的调度,它们是不有资格跑!8)处于运行状态的线程在运行过程中可能会进入同步方法或同步块。此时的他,拥有了对象的锁,至高无上。但是由于现在的环境,他可能没有必要继续执行了,所以他会自己放弃锁。资源让其他线程有机会继续执行,所以这个线程可能会调用synchronized里面对象的wait方法。一旦被调用,当前线程将放弃锁资源,自行进入等待池(waitpool),直到被其他线程调用。唤醒!如果不被唤醒,它们就会一直在等待池中,被线程阻塞,所以此时它们想要的就是被唤醒,因为只有唤醒才能继续运行!9)阻塞在等待池中的线程一旦被唤醒(可能是同步线程调用notify或notifyAll,或者外部调用中断导致抛出内部异常,也会获取到锁),那么该线程就会从waitingpool到锁池,继续阻塞,所以不要以为线程被唤醒后还会继续运行,这是不可能的,他们还需要去竞争锁资源。10)如果线程在运行过程中抛出异常,或者线程真的运行完了,那么这个线程就结束了,也就是死亡期。运行后不能继续启动。您必须创建一个新线程才能开始。然后会有一个生命周期。