进程 和 线程

进程

进程是操作系统进行资源分配的最小单位,有自己独立的地址空间,进程之间在某种程度上是相互隔离的,独立的运行程序,进程之间不能共享资源
进程可以支持多个线程,它们看似同时执行,但互相之间并不同步,一个进程中的多个线程共享相同的内存地址空间,这就意味着它们可以访问相同的变量和对象,而且它们从同一堆中分配对象。尽管这让线程之间共享信息变得更容易,但必须小心,确保它们不会妨碍同一进程里的其它线程

线程

线程也称作轻量级进程。是操作系统的最小调度单位,就象进程一样,线程在程序中是独立的、并发的执行路径,每个线程有它自己的堆栈、自己的程序计数器和自己的局部变量。但是,与分隔的进程相比,进程中的线程之间的隔离程度要小。它们共享内存、文件句柄和其它每个进程应有的状态。每个 Java 程序都至少有一个线程 ― 主线程。当一个 Java 程序启动时,JVM 会创建主线程,并在该线程中调用程序的 main() 方法。

java 线程的生命周期中的几种状态

java.lang.Thread 类中内部定义了一个枚举类State,该枚举类定义了线程生命周期的中对应的各种状态:
public enum State {
/** * Thread state for a thread which has not yet started. 新建状态,还没有调用start()方法执行 */
NEW,

    /**
     * Thread state for a runnable thread.  A thread in the runnable   可运行线程的线程状态。
     * state is executing in the Java virtual machine but it may  可运行的状态在Java虚拟机中执行,但可能
      *正在等待操作系统的其他资源,如处理器
     * be waiting for other resources from the operating system
     * such as processor.
     */
    RUNNABLE,

    /**
      * 线程阻塞 :等待临界区的锁的线程状态。
     * Thread state for a thread blocked waiting for a monitor lock.
     * A thread in the blocked state is waiting for a monitor lock  一个线程因为等待临界区的锁被阻塞产生的状态
     * to enter a synchronized block/method or
     * reenter a synchronized block/method after calling
     * {@link Object#wait() Object.wait}.  调用wait()方法会导致当前线程阻塞
     *  处于阻塞状态的线程正在等待锁,以便获得锁在调用后进入      
     *  同步块/方法或重新输入同步块/方法
     */
    BLOCKED,

    /**
     * Thread state for a waiting thread.
     * A thread is in the waiting state due to calling one of the
     * following methods:    
     * 由于调用以下方法之一,线程处于等待状态:
     * <ul>
     *   <li>{@link Object#wait() Object.wait} with no timeout</li>
     *   <li>{@link #join() Thread.join} with no timeout</li>
     *   <li>{@link LockSupport#park() LockSupport.park}</li>
     * </ul>
     *
     * <p>A thread in the waiting state is waiting for another thread to
     * perform a particular action.  于等待状态的线程正在等待另一个线程执行特定操作。
     *
     * For example, a thread that has called <tt>Object.wait()</tt>
     * on an object is waiting for another thread to call
     * <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on
     * that object. A thread that has called <tt>Thread.join()</tt>
     * is waiting for a specified thread to terminate.
     * 例如,一个在对象上调用Object.wait()的线程正在等待另一个线程调用该对象的Object.notify()或      
     * Object.notifyAll()。 已调用Thread.join()的线程正在等待指定的线程终止。
     */
    WAITING,

    /**
     * Thread state for a waiting thread with a specified waiting time.
     * A thread is in the timed waiting state due to calling one of
     * the following methods with a specified positive waiting time:
     * 指定等待时间的线程等待状态。 由于在调用以下方法之一指定了等待时间,因此线    
     * 程处于定时等待状态:
     * <ul>
     *   <li>{@link #sleep Thread.sleep}</li>
     *   <li>{@link Object#wait(long) Object.wait} with timeout</li>
     *   <li>{@link #join(long) Thread.join} with timeout</li>
     *   <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>
     *   <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>
     * </ul>
     */
    TIMED_WAITING,

    /**
      * 终止状态:线程执行完毕
     * Thread state for a terminated thread.
     * The thread has completed execution.
     */
    TERMINATED;
}

`
1、NEW(新建)
创建后尚未启动的线程处于这个状态。意思是这个线程对象只是被创建了,还没有调用start()方法启动

2、 RUNNABLE(可运行状态)
可运行状态,其实包含着两种细分的状态,一个是 已准备好(Ready),一个是正在运行(Runing)因为一个线程调用start()方法后,Cpu不一定就立马为该线程分配时间片,也有可能就创建后,就被分配了时间片,所以说线程此时的状态可能是正在运行,也能是在等待系统分配资源,RUNNABLE状态也可以理解为存活着正在尝试征用CPU的线程(有可能这个瞬间并没有占用CPU,但是它可能正在发送指令等待系统调度)。由于在真正的系统中,并不是开启一个线程后,CPU就只为这一个线程服务。

3、BLOCKED(阻塞状态)
BLOCKED称为阻塞状态,或者说线程已经被挂起,原因通常是它在等待一个“锁”,当一个线程试图获取一个内部的对象锁(非java.util.concurrent库中的锁),而该锁被其他线程持有,则该线程进入阻塞状态,(wait()方法的调用可能会造成线程进入BLOCKED状态,因为被唤醒后,运行还需要获得调用wait()方法时释放的对象锁)

阻塞和等待

阻塞:进入阻塞是被动的,当一个线程视图去获取一个锁对象,而这个锁对象被其他线程所持有,这时该线程会被阻塞
等待:进入等待是主动的,等待是指是在等待一段时间 后或者 有唤醒动作后,才会退出等待,如主动调用Object.wait(),如无法获取到ReentraantLock,主动调用LockSupport.park(),如主线程主动调用subThread.join(),让主线程等待子线程执行完毕再执行。

4 、WAITING(无限期等待)
处于这种状态的线程不会被分配CPU执行时间,它们要等待显示的被其它线程唤醒。这种状态通常是指一个线程拥有对象锁后进入到相应的代码区域后,调用相应的“锁对象”的wait()方法操作后产生的一种结果。变相的实现还有LockSupport.park()、Thread.join()等,它们也是在等待另一个事件的发生,也就是描述了等待的意思。以下方法:wait()方法,Thread.join(),LockSupport.park()(ReentrantLock.lock() ,操作后进入的是WAITING状态,其内部调用的是LockSupport.park()方法)等调用会使线程进入该状态

5、TIMED_WAITING(限期等待)
处于这种状态的线程也不会被分配CPU执行时间,不过无需等待被其它线程显示的唤醒,在一定时间之后它们会由系统自动的唤醒。以下方法:Thread.sleep(),wait(long),Thread.join(long),LockSupport.parkNanos(),LockSupport.parkUntil()

6、6、TERMINATED(终止状态)
线程运行结束,也就是说run()方法运行完毕,这只是Java语言级别的一种状态,在操作系统内部可能已经注销了相应的线程,或者将它复用给其他需要使用线程的请求,而在Java语言级别只是通过Java代码看到的线程状态而已。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 进程和线程 进程线程的区别1、进程是什么?是具有一定独立功能的程序、它是系统进行资源分配和调度的一个独立单位,重点...
    HeartGo阅读 1,192评论 0 4
  • 柳哲 千古美谈“坐怀不乱”的典故,出自春秋时期的柳下惠。孔孟对古圣先贤柳下惠推崇备至,孔子称扬他为高尚的“逸民”,...
    柳志儒阅读 174评论 0 0
  • 职场中经常会遇到各种各样的汇报,如项目开题会、总结会、学术交流会等,尤其是临近年底又要开展年度总结汇报,这次汇报至...
    新职口快阅读 1,780评论 0 1
  • 日威名酒安利野榜 如果说苏格兰威士忌像玛莎拉蒂,刺激、让人震撼、眩晕,就好像被一巴掌打在了脸上。那日本威士忌就像雷...
    你是馬鹿么阅读 3,324评论 0 2
  • 2017/10/28 今天是离开你的第四天 有时候不知道自己能坚持多久 坚持这样写多久 坚持等你多久 坚持爱你多久...
    拾丶Feyaness阅读 365评论 0 0