JAVA多线程编程学习笔记(二)- 线程生命周期及控制线程

1.线程的生命周期

线程的生命周期有新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)、和死亡(Dead)5种状态


线程状态转换

1.1新建和就绪状态

  • 当程序使用new关键字创建线程后,该线程处理新建状态,java虚拟机为其分配内存并初始化变量。
  • 当线程对象调用了start()方法后,该线程处于就绪状态,但是线程并未运行,等待Java虚拟机线程调度器的调度。==启动线程使用的是start()方法,而不是run()方法!== 如调用的某线程对象的run()方法,则该线程不再处于新建(new)状态。 start()方法只适用于处于新建状态的线程,不然会引发IllegalThreadStateException异常。

1.2运行和阻塞状态

  • 当处于就绪(Runnable)状态的线程获取了CPU资源,开始执行run()方法的线程执行体,则该线程处于运行状态,但该线程一般不会一直处于运行状态,系统会在一定时间后剥夺线程占用的资源,让其他线程获得执行的机会。
  • 当发生如下情况时线程会进入阻塞状态。
    • 线程调用sleep()方法主动放弃所有占用的处理器资源。
    • 线程调用了一个阻塞式IO方法,方法返回之前,该线程被阻塞。
    • 线程试图获得一个同步监视器,但该同步监视器正在被其他线程所持有,后面会详细介绍同步监视器。
    • 线程在等待某个通知(notify)。
    • 程序调用了线程的suspend()方法将线程挂起。但这个方法容易导致死锁,所以应该尽量避免使用该方法。
  • 当正在执行的线程被阻塞时,其他线程会获得被执行的机会。==被阻塞的线程会在合适的时候重新进入就绪(Runable)状态,而不是运行(Running)状态。==
    -发生以下特定的情况时可以解除线程的阻塞状态,让线程进入就绪状态。
    • 调用sleep()方法的线程经过了指定的时间。
    • 线程调用的阻塞式IO方法已经返回。
    • 线程成功地获得了试图取得的同步监视器。
    • 线程正在等待某个通知时,其他线程发出了一个通知。
    • 处于挂起状态的线程被调用了resume()恢复方法。
  • 调用yield()方法可以让运行的线程转入就绪状态。

1.3线程死亡

  • 线程结束后会处于死亡状态。以下是线程结束的三种方法
    • run()或call()方法执行完成,线程正常结束。
    • 线程抛出一个未捕获的Exception 或 Rrror。
    • 直接调用该线程的stop()方法结束线程,容易导致死锁,不推荐使用。
  • 检测某线程是否死亡,可以使用线程对象的 isAlive()方法,当线程处于就绪(Runnable)、运行(Running)、阻塞(Blocked)时,返回true;当线程处于新建(New)和死亡(Dead)状态时返回false。

2.控制线程

2.1 join线程

  • join()方法是由Thread类提供的让一个线程等待另一个线程完全完成的方法。当在某个程序执行流中调用其他线程的join()方法时,调用线程会被阻塞,直到join方法加入的join线程执行完为止。join()方法有以下三种重载形式:
    • join():等待被join的线程执行完成。
    • join(long millis):等待被join线程时间最长为millis毫秒。如果在mills毫秒内被join的线程还没执行结束,则不再等待

2.2 后台线程

  • 在后台运行,为其他线程提供服务,这种线程被称为"后台线程“(Daemon Thread)”,又成为“守护进程”,“精灵线程”。后台线程特点是如果所有的前台线程都死亡,后台线程会自动死亡。
    • setDaemon(true):该方法将指定的线程设置成后台线程。必须在start()方法前执行,否则会返回IllegalThreadStateException异常。
    • isDaemon():该方法用于判断指定线程是否为后台线程。

2.3 线程睡眠:sleep

  • Thread类的静态方法sleep(),可以让当前执行的进程暂停一段时间,并进入阻塞状态。
    • static void sleep(long millis):让当前执行的线程暂停mills毫秒,并进入阻塞状态。

2.4 线程让步:yield

  • yield()方法和sleep()方法有点相似,同样是由Thread类提供的静态方法,它可以让当前执行的线程暂停,但他不会阻塞该线程,只是将该线程转入就绪状态,从而让系统的线程调度器重新调度一次。当某个线程调用了yield()方法暂停后,只有与当前线程相同或者更高优先级的线程才会重新获得执行的机会。
  • yield()方法和sleep()方法的差异:
    • sleep()方法暂停当前线程后,会给其他线程执行的机会,不会理会其他线程的优先级;但yield()方法只会给优先级相同,或优先级更高的线程执行机会。
    • sleep()方法会将线程转为阻塞状态,直到经过阻塞时间会转入就绪状态;而yield()不会将线程转入阻塞状态,它只是强制将当前线程进入就绪状态。
    • sleep()方法声明抛出了InterruptedException异常,所以调用sleep()方法要么捕捉该异常,要么显示抛出该异常;yield()方法没有抛出任何异常。
    • sleep()方法比yield()方法有更好的可移植性,通常不建议使用yield()方法来控制并发线程的执行。

2.5 改变线程优先级

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

推荐阅读更多精彩内容