一个线程的产生是从我们调用了start方法开始进入Runnable状态,即可以被调度运行状态,并没有真正开始运行,调度器可以将CPU分配给它,真正运行其中的程序代码。线程在运行过程中,有以下几个可能的去向:
①没有任何阻隔,运行完成直接结束,也就是run()方法执行完毕。
②调度器将CPU分配给其他线程,这个线程又变为Runnable状态。
③请求锁旗标,却得不到,这时候它要等待对象的锁旗标,得到锁旗标后又会进入Runnable状态开始运行。
④遇到wait方法,他会被放入等待池中继续等待,直到有notify()或interrupt()方法执行,它才会被唤醒或打断开始等待对象锁旗标,等到锁旗标后进入Runnable状态继续执行。
控制线程声明周期的方法有很多种,如suspend方法、resume方法和stop方法。但不推荐这种方法。
不推荐使用suspend和resume是因为:
①会导致死锁。
②它允许一个线程(甲)通过直接控制另外一个线程(乙)的代码来直接控制那个线程(乙)。
stop能避免死锁,但是带来了另外的不足,如果一个线程正在操作共享数据段,操作过程没有完成就stop了的话,将会导致数据的不完整。因此stop方法也不提倡使用。
推荐使用控制run方法中循环条件的方法来结束一个线程。