最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java終止線程實例和stop()方法源碼閱讀

 更新時間:2017年12月29日 15:19:24   作者:Rainmonth  
這篇文章主要介紹了Java終止線程實例和stop()方法源碼閱讀,具有一定借鑒價值,需要的朋友可以參考下

了解線程

概念

線程 是程序中的執(zhí)行線程。Java 虛擬機允許應用程序并發(fā)地運行多個執(zhí)行線程。

線程特點

擁有狀態(tài),表示線程的狀態(tài),同一時刻中,JVM中的某個線程只有一種狀態(tài);

·NEW

尚未啟動的線程(程序運行開始至今一次未啟動的線程)

·RUNNABLE

可運行的線程,正在JVM中運行,但它可能在等待其他資源,如CPU。

·BLOCKED

阻塞的線程,等待某個鎖允許它繼續(xù)運行

·WAITING

無限等待(再次運行依賴于讓它進入該狀態(tài)的線程執(zhí)行某個特定操作)

·TIMED_WAITING

定時等待(再次運行依賴于讓它進入該狀態(tài)的線程在指定等待時間內(nèi)某個特定操作)

·TERMINATED

已退出的線程

擁有優(yōu)先級,決定線程的執(zhí)行順序;

1至10之間的整數(shù),默認數(shù)值為5。數(shù)值越高,執(zhí)行的幾率越高,優(yōu)先級并不能決定線程的執(zhí)行順序。

子線程的優(yōu)先級默認同父線程的一樣。

注意,當以下情況發(fā)生時,JVM將停止執(zhí)行所有線程:

Runtime(運行時)的exit ()方法被調(diào)用并且該方法的調(diào)用被Security Manager所允許;

所有的“非守護線程”都已停止運行(無論時正常停止還是一場停止);

可以被標記為守護程序(Daemon)

守護線程的子線程仍是守護線程;

守護線程也就是“后臺線程”,一般用來執(zhí)行后臺任務,而用戶線程一般用戶執(zhí)行用戶級任務。

終止線程的方法

1.使用退出標志,使線程正常退出,也就是當run方法完成后線程終止。

當run方法執(zhí)行完后,線程就會退出。但有時run方法是永遠不會結束的。如在服務端程序中使用線程進行監(jiān)聽客戶端請求,或是其他的需要循環(huán)處理的任務。在這種情況下,一般是將這些任務放在一個循環(huán)中,如while循環(huán)。如果想讓循環(huán)永遠運行下去,可以使用while(true){……}來處理。但要想使while循環(huán)在某一特定條件下退出,最直接的方法就是設一個boolean類型的標志,并通過設置這個標志為true或false來控制while循環(huán)是否退出。下面給出了一個利用退出標志終止線程的例子。

FlagExitThread.java

package com.rainmonth;
/**
* Created by RandyZhang on 2017/3/23.
*/
public class FlagExitThread extends Thread {
	public volatile Boolean isExit = false;
	public FlagExitThread(String name) {
		super(name);
	}
	@Override
	  public void run() {
		while (!isExit) {
			System.out.println("I'm running");
		}
	}
}

DemoClient.java

package com.rainmonth;
/**
* Created by RandyZhang on 2017/3/23.
*/
public class DemoClient {
	public static void main(String[] args) {
		System.out.println("優(yōu)雅的終止線程實例");
		exitByFlag();
		// exitByInterrupt();
	}
	private static void exitByFlag() {
		FlagExitThread flagExitThread = new FlagExitThread(FlagExitThread.class.getSimpleName());
		flagExitThread.start();
		try {
			Thread.sleep(1000);
			flagExitThread.isExit = true;
			flagExitThread.join();
			System.out.println("線程退出");
		}
		catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	private static void exitByInterrupt() {
		FlagExitThread flagExitThread = new FlagExitThread(FlagExitThread.class.getSimpleName());
		System.out.println("flagExitThread running...");
		flagExitThread.start();
		try {
			Thread.sleep(1500);
			System.out.println("flagExitThread interrupted...");
			flagExitThread.interrupt();
			Thread.sleep(1500);
			System.out.println("stop application...");
		}
		catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

輸出結果:

打印了一大堆I'm running之后線程退出。

2.使用stop方法強行終止線程(這個方法不推薦使用,因為stop和suspend、resume一樣,也可能發(fā)生不可預料的結果)。

顯示調(diào)用stop()方法。源碼中關于stop() 的描述如下:

/*
* This method is inherently unsafe. Stopping a thread with
* Thread.stop causes it to unlock all of the monitors that it
* has locked (as a natural consequence of the unchecked
* <code>ThreadDeath</code> exception propagating up the stack). If
* any of the objects previously protected by these monitors were in
* an inconsistent state, the damaged objects become visible to
* other threads, potentially resulting in arbitrary behavior. Many
* uses of <code>stop</code> should be replaced by code that simply
* modifies some variable to indicate that the target thread should
* stop running. The target thread should check this variable
* regularly, and return from its run method in an orderly fashion
* if the variable indicates that it is to stop running. If the
* target thread waits for long periods (on a condition variable,
* for example), the <code>interrupt</code> method should be used to
* interrupt the wait.
*/

大意就是說,該方法的不安全性時固有的。調(diào)用stop()終止一個線程會釋放它已經(jīng)鎖定的所有監(jiān)視器(這將導致沿堆棧向上傳播為檢查的ThreadDeath異常被拋出),若此時之前受這些被釋放的監(jiān)視器保護的對象存在不一致性,并且這些對象對其他線程可見,這就會導致一些意想不到的后果。stop操作應該有哪些僅僅只需要修改某些代碼就可以指示目標線程應該停止運行的代碼來取代(方法一就是這種方式)。如果目標線程由于等待某一條件(如某個條件變量)等待很長時間,我們應該使用interrupt方法來中斷該等待(方法三就是這種方式)。

3.使用interrupt方法中斷線程。

interrupt字面上是終止的意思,但不要試圖通過調(diào)用interrupt來終止線程,因為有時即使你調(diào)用了該方法,線程仍然會繼續(xù)執(zhí)行,可以注釋掉上面的exitByFlag(),開啟exitByInterrupt() 方法,發(fā)現(xiàn)及時調(diào)用了interrupt()方法,仍在一直輸出I'm running…(不同系統(tǒng)及CPU結果可能有所不同),可見采用interrupt方式也是不安全的。

總結

根據(jù)以上的分析,最值得推薦的方式是第一種,我們可以用共享變量(shared variable)的方式來設置標志,并發(fā)出信號,通知線程必須終止。當然對這個共享變量的操作我們必須保證是同步的。

以上就是本文關于Java終止線程實例和stop()方法源碼閱讀的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

相關文章

  • Mac?M1安裝JDK的實戰(zhàn)避坑指南

    Mac?M1安裝JDK的實戰(zhàn)避坑指南

    這篇文章主要給大家介紹了關于Mac?M1安裝JDK避坑的相關資料,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2023-02-02
  • Spring框架實現(xiàn)滑動驗證碼功能的代碼示例

    Spring框架實現(xiàn)滑動驗證碼功能的代碼示例

    之前項目需要在驗證碼模塊,增加滑動驗證碼,用來給手機端使用的,大概看了下,主要方法就是將圖片切割,然后記住偏移量,進行滑動,所以本文給大家介紹了Spring框架實現(xiàn)滑動驗證碼功能的方法示例,需要的朋友可以參考下
    2024-07-07
  • logback的UNDEFINED_PROPERTY屬性源碼執(zhí)行流程解讀

    logback的UNDEFINED_PROPERTY屬性源碼執(zhí)行流程解讀

    這篇文章主要為大家介紹了logback的UNDEFINED_PROPERTY屬性源碼執(zhí)行流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • 使用Java代碼實現(xiàn)Redis和數(shù)據(jù)庫數(shù)據(jù)同步

    使用Java代碼實現(xiàn)Redis和數(shù)據(jù)庫數(shù)據(jù)同步

    這篇文章主要介紹了使用Java代碼實現(xiàn)Redis和數(shù)據(jù)庫數(shù)據(jù)同步問題,文中通過代碼示例給大家講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-06-06
  • Spring之SseEmitter實現(xiàn)讓你的進度條實時更新

    Spring之SseEmitter實現(xiàn)讓你的進度條實時更新

    Spring SseEmitter是一種實現(xiàn)服務器端推送事件(SSE)的機制,支持單向通信,適用于實時數(shù)據(jù)傳輸需求,通過代碼示例和應用場景分析,展示了如何在服務端和客戶端使用SseEmitter進行實時數(shù)據(jù)推送
    2025-02-02
  • 在Java中實現(xiàn)可見性(visibility)的主要方法詳解

    在Java中實現(xiàn)可見性(visibility)的主要方法詳解

    這篇文章主要介紹了在Java中實現(xiàn)可見性(visibility)的主要方法詳解,在Java中,使用關鍵字volatile和使用鎖(如synchronized關鍵字或 java.util.concurrent包中的鎖)來確保對共享變量的修改在多線程環(huán)境中能夠正確地被其他線程所觀察到,需要的朋友可以參考下
    2023-08-08
  • 詳解Java?@Documented注解的作用

    詳解Java?@Documented注解的作用

    @Documented和@Deprecated注解長得有點像,@Deprecated是用來標注某個類或者方法不建議再繼續(xù)使用,@Documented只能用在注解上,本文將通過示例詳細說說@Documented注解的作用,需要的可以參考一下
    2022-09-09
  • java若依框架集成redis緩存詳解

    java若依框架集成redis緩存詳解

    今天小編就為大家分享一篇關于java若依框架集成redis緩存的實現(xiàn),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2021-08-08
  • springboot 用監(jiān)聽器統(tǒng)計在線人數(shù)案例分析

    springboot 用監(jiān)聽器統(tǒng)計在線人數(shù)案例分析

    這篇文章主要介紹了springboot 用監(jiān)聽器統(tǒng)計在線人數(shù)案例分析,質(zhì)是統(tǒng)計session 的數(shù)量,思路很簡單,具體實例代碼大家參考下本文
    2018-02-02
  • 在Java8與Java7中HashMap源碼實現(xiàn)的對比

    在Java8與Java7中HashMap源碼實現(xiàn)的對比

    這篇文章主要介紹了在Java8與Java7中HashMap源碼實現(xiàn)的對比,內(nèi)容包括HashMap 的原理簡單介紹、結合源碼在Java7中是如何解決hash沖突的以及優(yōu)缺點,結合源碼以及在Java8中如何解決hash沖突,balance tree相關源碼介紹,需要的朋友可以參考借鑒。
    2017-01-01

最新評論

南投县| 定结县| 兰考县| 青川县| 临颍县| 峨山| 安阳市| 汽车| 泗水县| 峨边| 孝义市| 兰考县| 治多县| 徐州市| 仁怀市| 武定县| 教育| 胶州市| 大冶市| 来凤县| 宜都市| 浙江省| 邵阳县| 永新县| 孟津县| 天祝| 吴堡县| 商南县| 中方县| 栾城县| 武定县| 新民市| 临江市| 三门县| 搜索| 宜兰县| 江安县| 赣榆县| 博乐市| 阳西县| 健康|