进程是一个正在执行的程序,每个进程都有自己的执行顺序,和执行路径,或者叫控制单元;而线程就是进程里面的执行路径,每个进程里面至少有一个线程,两个线程或两个以上的线程则称为多线程;而多线程的执行是靠争取CPU的执行权力,一个CPU只能执行一个线程,只不过是切换的快,我们所看到的是一块执行;多线程是多个代码同时执行。
线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、堵塞状态以及死亡状态
1、新建(new)
当用New操作符创建一个线程时,例如 new Thread(r),线程还没开始运行,此时线程处于新建状态。当一个线程处于新生状态时,程序还没有开始运行线程中的代码。
2、就绪(runnable)
一个新创建的线程并不会自动开始运行,要执行线程必须调用线程的start()方法。当线程对象调用了start()方法之后,即启动了线程,start()方法创建线程运行的系统资源,并调度线程运行run()方法。当start()方法返回后,线程就会进入到就绪状态。
线程进入到就绪状态并不一定会立即执行run()方法,线程必须同其他线程进行竞争CPU时间,获取时间片,这有这样才能运行。因为在单CPU的计算机系统中,不能同时运行多个线程,一个时刻只有一个线程处于运行状态。这里Java采用的是抢占式的调度算法
3、运行状态(running)
当线程获取CPU时间后,它才进入运行状态,真正开始执行run()方法
4、阻塞状态(Blocked)
1):线程通过调用sleep方法进入睡眠状态
2):线程调用一个在I/O上被堵塞的操作,即该操作在输入输出完成之前不会返回到它的调用者
3):线程试图获取一个锁,而该锁正在被其他线程持有
4):线程正在等待某个触发条件
总而言之,堵塞状态就是正在运行的线程没有运行结束,暂时让出CPU,这时其他处于就绪状态的线程就会获得CPU时间,进入运行状态
5、死亡(dead)
1):run方法正常退出而自然死亡
2):一个未捕获的异常中止了run方法的运行而使线程猝死
?
?