
多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的。
一.线程的生命周期及五种基本状态

关于Java中线程的生命周期,首先看一下下面这张较为经典的图:


上图中基本上囊括了Java中多线程各重要知识点。掌握了上图中的各知识点多线程编程,Java中的多线程也就基本上掌握了。主要包括:
Java线程具有五中基本状态

新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread();
// 调用 wait 方法释放对象上的锁并阻止该线程(线程状态为 waitsleepjoin) // 该线程进入到同步对象的等待队列,直到其它线程调用 pulse 使该线程进入到就绪队列中 // 线程进入到就绪队列中才有条件争夺同步对象的所有权 // 如果没有其它线程调用 pulse/pulseall 方法,该线程不可能被执行 monitor.wait(monitor)。如果任意一个线程调用了exit或_exit,则整个进程的所有线程都终止,由于从main函数return也相当于调用exit,为了防止新创建的线程还没有得到执行就终止,我们在main函数return之前延时1秒,这只是一种权宜之计,即使主线程等待1秒,内核也不一定会调度新创建的线程执行,1.2我们会看到更好的办法。由于线程a和线程b持有同一个myobject类的对象object,尽管这两个线程需要调用不同的方法,但是它们是同步执行的,比如:线程b需要等待线程a执行完了methoda()方法之后,它才能执行methodb()方法。

如果处于就绪状态的线程获得了cpu,则开始执行run()方法的线程执行体,则该线程就处于运行状态。延迟的就绪(deferredready):处于延迟的就绪状态的线程也已经准备好可以运行了,但是,与就绪状态不同的是,它尚未确定在哪个处理器上运行。一个线程可以调用pthread_mutex_lock获得mutex(操作系统调度执行此线程),如果这时另一个线程已经调用pthread_mutex_lock获得了该mutex,则当前线程需要挂起等待(操作系统仍可能在调度执行此线程),(操作系统调度切换运行另一线程)直到另一个线程调用pthread_mutex_unlock释放mutex多线程编程,(另一线程释放mutex时操作系统调度运行此线程)当前线程被唤醒(即从此线程上次执行的地方继续执行),才能获得该mutex并继续执行。
阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才 有机会再次被CPU调用以进入到运行状态。根据阻塞产生的原因不同,阻塞状态又可以分为三种:
1.等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态;
2.同步阻塞 -- 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态;
当sleep()状态超时、join()等待线程终止,或者超时、或者i/o处理完毕时,线程重新转入可运行状态。1. 终止线程处于阻塞状态,如sleep(),在该状态下可以使用interrupt()方法终止线程,且在终止的时候sleep会抛出一个interruptedexception异常(注意:如果线程的阻塞是i/o阻塞,需要先close(),后interrupt()才生效,否则不生效)。由于sleep和wait会使线程处于阻塞或冻结状态,可能等不到所等的事件而无法终止,所以需要从外部调用interrupt()方法中断他们的阻塞状态,此时就会抛interruptedexception异常(api对这个异常的描述为:当线程在活动之前或活动期间处于正在等待、休眠或占用状态且该线程被中断时,抛出该异常。
死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-106822-1.html
反咬一口啊