java线程的生命周期( 二 )


  1. object.wait()
  2. thread.join()
  3. LockSupport.park()
其中1,2方法不需要传入时间参数 。
我们看下使用的例子:
public class WaitThread implementsRunnable{public static Thread t1;@Overridepublic void run() {Thread t2 = new Thread(()->{try {Thread.sleep(10000);} catch (InterruptedException e) {Thread.currentThread().interrupt();log.error("Thread interrupted", e);}log.info("t1"+t1.getState().toString());});t2.start();try {t2.join();} catch (InterruptedException e) {Thread.currentThread().interrupt();log.error("Thread interrupted", e);}log.info("t2"+t2.getState().toString());}public static void main(String[] args) {t1 = new Thread(new WaitThread());t1.start();}}在这个例子中,我们调用的t2.join(),这会使调用它的t1线程处于WAITTING状态 。
我们看下输出结果:
12:44:12.958 [Thread-1] INFO com.flydean.WaitThread - t1 WAITING12:44:12.964 [Thread-0] INFO com.flydean.WaitThread - t2 TERMINATEDTIMED_WAITINGTIMED_WAITING状态表示在一个有限的时间内等待其他线程执行特定的某些操作 。
java中有5中方式来达到这种状态:
  1. thread.sleep(long millis)
  2. wait(int timeout) 或者 wait(int timeout, int nanos)
  3. thread.join(long millis)
  4. LockSupport.parkNanos
  5. LockSupport.parkUntil
我们举个例子:
public class TimedWaitThread implementsRunnable{@Overridepublic void run() {try {Thread.sleep(5000);} catch (InterruptedException e) {Thread.currentThread().interrupt();log.error("Thread interrupted", e);}}public static void main(String[] args) throws InterruptedException {TimedWaitThread obj1 = new TimedWaitThread();Thread t1 = new Thread(obj1);t1.start();// The following sleep will give enough time for ThreadScheduler// to start processing of thread t1Thread.sleep(1000);log.info(t1.getState().toString());}}上面的例子中我们调用了Thread.sleep(5000)来让线程处于TIMED_WAITING状态 。
看下输出:
12:58:02.706 [main] INFO com.flydean.TimedWaitThread - TIMED_WAITING那么问题来了,TIMED_WAITING和WAITTING有什么区别呢?
TIMED_WAITING如果在给定的时间内没有等到其他线程的特定操作,则会被唤醒,从而进入争夺资源锁的队列,如果能够获取到锁,则会变成Runnable状态,如果获取不到锁,则会变成BLOCKED状态 。
TERMINATEDTERMINATED表示线程已经执行完毕 。我们看下例子:
public class TerminatedThread implements Runnable{@Overridepublic void run() {}public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(new TerminatedThread());t1.start();// The following sleep method will give enough time for// thread t1 to completeThread.sleep(1000);log.info(t1.getState().toString());}}输出结果:
13:02:38.868 [main] INFO com.flydean.TerminatedThread - TERMINATED
【java线程的生命周期】


推荐阅读