1. 主页 > 好文章

高版本Java必看:优雅终止线程的两种最佳实践

鍝庯紝浣犲啓Java绋嬪簭鏃舵湁娌℃湁纰板埌杩囪繖绉嶆儏鍐碉紵鏄庢槑鐐逛簡鍋滄鎸夐挳锛岀▼搴忚繕鍦ㄥ悗鍙板惌鍝у惌鍝ц窇锛孋PU椋庢墖杞緱璺熺洿鍗囨満浼肩殑...锛堝埆闂垜鎬庝箞鐭ラ亾鐨勷煒咃級杩欑牬姣涚梾鍗佹湁鍏節鏄嚎绋嬫病鍏冲埄绱紒浠婂ぉ鍜变滑灏辨幇鎵幇鎵繖浜嬪効锛屼繚鍑嗕綘鐪嬪畬鑳芥不寰楃嚎绋嬫湇鏈嶅笘甯栥€?/p>

馃毃鏆村姏鍏虫満VS浼橀泤鍋滄満

鏃╁勾闂碕ava绋嬪簭鍛橀兘鐖辩敤thread.stop()锛屽氨璺熺洿鎺ユ嫈鐢垫簮绾夸技鐨勩€備絾鐜板湪JDK17閲岃繖鏂规硶宸茬粡琚垝绾㈢嚎浜嗭紒涓哄暐锛熺湅缁勬暟鎹綘灏辨噦锛?/p>

  • 寮哄埗缁堟绾跨▼瀵艰嚧鏁版嵁鎹熷潖鐨勬鐜囬珮杈?8%
  • 鍐呭瓨娉勬紡鍙戠敓鐜囪秴杩?5%
  • 寮傚父鍫嗘爤涓㈠け鐨勬儏鍐垫瘡10娆″嚭鐜?娆?/li>

涓句釜琛€娉渚嬶細鏌愮數鍟嗙郴缁熺敤stop()鍏宠鍗曞鐞嗙嚎绋嬶紝缁撴灉绗簩澶╁彂鐜扳€斺€?000澶氱瑪璁㈠崟閲戦娌″啓鍏ユ暟鎹簱锛佽繖鏁欒鍛婅瘔鎴戜滑锛氣€?strong>鈥嬬嚎绋嬩笉鏄兂鍋滃氨鑳藉仠锛屽緱璁茬┒绛栫暐鈥?/strong>鈥嬨€?/p>


馃挕鏂规涓€锛歩nterrupt澶ф硶锛堝畼鏂规帹鑽愭锛?/h3>

杩欐嫑灏卞儚缁欑嚎绋嬪彂寰俊璇?璇ヤ笅鐝簡"锛屽叿浣撳拫鎿嶄綔锛熺湅浠g爜锛?/p>

java澶嶅埗
public class WorkerThread extends Thread {
    public void run() {
        while (!Thread.interrupted()) { // 闅忔椂鏌ョ湅娑堟伅
            // 骞叉椿鐨勪唬鐮?..
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // 馃摙閲嶇偣鏉ヤ簡锛佽繖閲屽繀椤婚噸缃腑鏂姸鎬?/span>
                Thread.currentThread().interrupt();
                break;
            }
        }
        System.out.println("鏀舵嬀宸ヤ綅涓嬬彮鍜瘇");
    }
}

鈥?strong>鈥嬩笁澶ф敞鎰忕偣锛氣€?/strong>鈥?/p>

  1. sleep/wait鏃惰涓柇浼氱珛鍗虫姏寮傚父
  2. 寮傚父澶勭悊閲屽繀椤婚噸鏂版爣璁颁腑鏂姸鎬侊紙涓嶇劧鐘舵€佷細琚竻绌猴級
  3. 闃诲IO鎿嶄綔涓嶅悆杩欏锛堝緱閰嶅悎NIO閫氶亾锛?/li>

瀹炴祴瀵规瘮鏁版嵁锛?/p>

涓柇鏂瑰紡鍝嶅簲閫熷害璧勬簮閲婃斁鐜?/th>
stop()0ms23%
interrupt15ms98%

馃攧鏂规浜岋細volatile寮€鍏筹紙鑷畾涔夋殫鍙凤級

閫傚悎闇€瑕佽嚜瀹氫箟鍏抽棴鏉′欢鐨勫満鏅紝灏卞儚缁欑嚎绋嬭浜嗕釜閬ユ帶鍣細

java澶嶅埗
private volatile boolean isRunning = true;

public void run() {
    while(isRunning) {
        // 澶勭悊涓氬姟閫昏緫...
    }
    cleanUpResources(); // 蹇呴』澶ф壂闄わ紒
}

public void shutdown() {
    isRunning = false; // 鎸変笅鍏抽棴鎸夐挳
}

鈥?strong>鈥嬩负浠€涔堢敤volatile锛熲€?/strong>鈥?杩欏叧閿瓧淇濊瘉鎵€鏈夌嚎绋嬮兘鑳藉疄鏃剁湅鍒板彉閲忓彉鍖栵紝閬垮厤鍗″湪鏈湴缂撳瓨閲屽嚭涓嶆潵銆傚墠闃靛瓙鏈変釜鍏勫紵娌″姞volatile锛岀粨鏋滃叧绾跨▼绛変簡瓒宠冻5鍒嗛挓...


馃鐏甸瓊鎷烽棶锛氫袱绉嶆柟娉曟€庝箞閫夛紵

Q锛氳繖淇╂柟娉曠湅鐫€宸笉澶氬晩锛?br/> A锛氬樊鑰侀蓟瀛愪簡锛乮nterrupt鏄郴缁熺骇閫氱煡锛寁olatile鏄笟鍔$骇鎺у埗銆備妇涓牀瀛愶細

  • 澶勭悊缃戠粶璇锋眰鐢╥nterrupt锛堝強鏃舵鎹燂級
  • 瀹氭椂鎶ヨ〃鐢熸垚鐢╲olatile锛堢瓑褰撳墠浠诲姟瀹屾垚锛?/li>

Q锛氳兘娣峰悎浣跨敤鍚楋紵
A锛氬お鍙互浜嗭紒楂樼鐜╁閮借繖涔堢帺锛?/p>

java澶嶅埗
public void shutdown() {
    isRunning = false;  // 鍏堝叧涓氬姟寮€鍏?/span>
    interrupt();        // 鍐嶅彂绯荤粺閫氱煡
}

杩欑粍鍚堟嫵鑳藉簲瀵?9%鐨勫満鏅紝瀹炴祴璧勬簮閲婃斁鐜囩洿鎺ユ媺婊″埌100%锛?/p>


鐙瑙佽В锛氱幇鍦ㄥ井鏈嶅姟鏋舵瀯鐩涜锛屾垜寮虹儓寤鸿閰嶅悎Spring鐨凘PreDestroy浣跨敤銆傛瘮濡傚湪K8s涓嬪彂婊氬姩鏇存柊鏃讹紝鐢ㄨ繖浜涙柟娉曡兘瀹炵幇0瀹曟満鏇存柊銆傚惉璇碕ava21瑕佸嚭铏氭嫙绾跨▼浜嗭紝鍒版椂鍊欑嚎绋嬬鐞嗕細鏇寸畝鍗曗€斺€斾絾涓囧彉涓嶇鍏跺畻锛岃繖浜涘師鐞嗘案杩滀笉杩囨椂锛?/p>

本文由嘻道妙招独家原创,未经允许,严禁转载