武汉北大青鸟中南软件学院
400-027-0822

武汉北大青鸟中南软件学院带你了解JAVA多线程

2016-06-02供稿中心: 北大青鸟武汉中南软件学院

在多线程程序中,多个线程被并发的执行以提高程序的效率,CPU不会因为某个线程需要等待资源而进入空闲状态。北大青鸟专家总结表示:如果你对Java的多线程机制并没有深入的研究,那么本文可以帮助你更透彻地理解Java多线程的原理以及使用方法:一起来看看吧!
1.竞争对象的锁和竞争CPU资源以及竞争被唤醒
2.)何种情况下获取到了锁,何种情况下会释放锁

1.Thread t = new Thread(),初始化一个线程,实际上就是一个普通对象,此时他的状态为New

2.t.start();线程处于就绪状态(可运行状态),也就是随时等待着运行,不要小看这个start,这个start决定了他是否是一个真正的线程实例,因为start为其准备了线程环境,你若只是普通调用run方法,那么这就是一个普通的方法。处在这个时候的线程,都会去竞争CPU资源,所以谁被竞争到了CPU资源,也就是被调度Scheduler,那么他就可以从可运行状态到真正运行状态。
3.当线程获取到了CPU资源时,线程就从可运行状态到真正运行状态,也就是Running,不用怀疑,他现在正在运行。
4.如果这个线程正在等待客户输入学习,也就是IO异常,等各种阻塞事件,也有可能是自己调用了sleep等阻塞事件,线程就会从运行状态转为阻塞状态,这个状态是不会发生任何事情的!
5.一旦阻塞事件被清除,比如用户已经输入完成,IO流已经关闭,sleep也已经超时等,线程从阻塞状态变为就绪状态,又一次回到了可运行状态,随时与别的线程竞争资源,等待运行!
6.处于运行状态的线程可能会在运行当中遇到了同步方法或同步块,也就是synchronized标记的方法或块,这个时候该线程获到了对象的锁,其他线程就无法进入该同步方法,那么这些无法执行的线程怎么办呢?他们就都阻塞在这里,等待锁的释放,从新去竞争锁资源,因为只有拥有锁的线程才有资格继续往下运行,那么这里这些线程就阻塞在锁池(Lock Pool)。
7.一旦被阻塞在锁池的线程竞争到了锁(之前的线程运行完了或之前的线程在内部跑出来异常,或者调用了wait等,都会释放线程的锁),那么这个线程就会从阻塞状态转为就绪状态,不要以为这个线程会立刻执行,这是不可能的,你要想到线程执行都是要获取到CPU资源的,如果没有操作系统的调度,他们都没有资格运行!
8.处于运行状态的线程可能会在运行当中进入了同步方法或同步块,这个时候他拥有了对象的锁,至高无上,可是由于当前环境可能导致他没必要继续执行,所以他会自己让出锁资源让别的线程也有机会继续执行,所以这个线程可能在synchronized内部调用所对象的wait方法,一旦调用,当前线程让出锁资源,同时自己进入等待池(wait pool)中,直到被别的线程唤醒!如果没有被唤醒就一直会处在等待池当中,受到线程的阻塞,所以这个时候他们一心想要的是被唤醒,因为只有唤醒才有可能继续运行!
9.一旦被阻塞在等待池的线程被唤醒(可能是某个synchronized的线程调用了notify或notifyAll,也可能是外部调用interrupt导致内部抛出异常,也会获取到锁),那么这个线程就会从等待池转为锁池当中,继续阻塞,所以不要以为线程被唤醒就会继续运行,这是不可能的,他们同样需要竞争锁资源。
线程运行过程中抛出异常,或者线程实在运行完了,那么线程就结束了,也就是消亡期。运行完了是不可以继续start的,必须从新new一个线程才能start。那么将是有一个生命周期。
北大青鸟中南软件学院后提醒同学们,多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一,希望同学们牢固的掌握Java多线程基础知识来对应日后碰到的问题。
关于我们
首页
公司简介
课程专业
师资力量
高薪就业
青鸟课程
ACCP
学士后Java
基础教育
UI设计
回到首页