创建线程的两种方法
1.继承Thread类
2.实现Runnable接口
线程从创建到消亡分为新建、就绪、运行、阻塞、死亡5种状态。
新建状态
创建一个线程就处于新建状态。此时线程对象已经被分配了内存空间,并且私有数据也被初始化,但是该线程还不能运行。
就绪状态
在处于新建状态的线程中调用start()方法可以将线程状态转换成就绪状态,即启动线程。此时,线程已经得到除cpu时间之外的其他系统资源,只等待JVM的线程调度器按照线程的优先级对该线程进行调度,从而使该线程拥有获得cpu时间片的机会。
运行状态
运行状态表示线程被调度并且获得了CPU的控制权。此时会自动调用该线程对象的run()方法,并且这个线程会一直运行到结束,除非该线程主动放弃CPU的控制权或者CPU控制权被优先级更高的线程抢占。处于运行状态的线程就会让出CPU控制权。
阻塞状态
一个正在执行的线程在某些特殊情况下,可能会被人挂起,让出CPU。暂时中止执行,进入阻塞状态。例如,调用sleep()、wait()等方法,线程都将进入阻塞状态。线程阻塞时不能进入就绪队列,只有在某些事件唤醒线程后,线程才能重新进入就绪队列而处于就绪状态。
死亡状态
正常情况下,run()方法返回会使得线程终止,调用stop()方法或destory()方法也能终止线程,但不推荐使用这两个方法,因为stop()方法会使程序产生异常,而destory()方法强制终止线程,不释放内存,会造成内存泄漏。