首页 > 投稿 > 正文内容

如何正确关闭Java线程?推荐interrupt()与标志位实战

投稿2025-05-27 12:35:46

鈥?strong>鈥嬧€滀綘鐨凧ava绾跨▼鏄笉鏄粡甯糕€樿禆搴娾€欎笉閫€鍑猴紵鈥濃€?/strong>鈥?br/> 涓婂懆鏈変釜鏈嬪弸鍗婂缁欐垜鎵撶數璇濓紝璇翠粬鍐欑殑璁㈠崟绯荤粺鍑屾櫒鑷姩鎸傛帀銆傛垜杩滅▼涓€鐪嬧€斺€斿ソ瀹朵紮锛岀嚎绋嬫睜閲岀殑worker绾跨▼鍏ㄥ湪瑁呮锛岃鍗曟暟鎹崱鍦ㄥ唴瀛橀噷娌″瓨鐩樸€備竴闂墠鐭ラ亾锛屼粬鐩存帴鐢?code>Thread.stop()鍏崇嚎绋嬶紝缁撴灉瑙﹀彂杩為攣鍙嶅簲銆備粖澶╁挶浠氨鎵嬫妸鎵嬫暀浣犱袱鎷涗繚鍛芥妧锛屼笓娌诲悇绉嶇嚎绋嬭禆搴婏紒


馃攳 鍏堟悶鏄庣櫧锛氱嚎绋嬩负浠€涔堜笉鑲箹涔栭€€鍑猴紵

锛堟斁涓嬫墜閲岀殑鍜栧暋锛屾帍鍑哄皬鐧芥澘锛夊挶浠厛鐪嬫缁忓吀姝诲惊鐜唬鐮侊細

java澶嶅埗
Thread t = new Thread(() -> {
    while(true) { // 杩欒灏辨槸涓囨伓涔嬫簮
        System.out.println("鎴戝湪骞叉椿...");
    }
});
t.start();

鈥?strong>鈥嬮棶棰樻潵浜嗏€?/strong>鈥嬶細濡傛灉浣犱笉骞查锛岃繖绾跨▼鑳借窇鍒板ぉ鑽掑湴鑰併€傚父瑙佺炕杞︾幇鍦烘湁锛?/p>

  1. 绾跨▼鍗″湪鈥?strong>鈥嬮樆濉炵姸鎬佲€?/strong>鈥嬶紙姣斿绛夌綉缁滃搷搴旓級
  2. 寰幆鏉′欢娌¤閫€鍑哄紑鍏筹紙灏卞儚涓婇潰鐨剋hile(true)锛?/li>
  3. 澶氫釜绾跨▼浜掔浉绛夊鏂归噴鏀鹃攣锛堜紶璇翠腑鐨勬閿侊級

涓句釜鐪熷疄妗堜緥锛氭煇鐢靛晢绯荤粺鐢?code>Thread.stop()寮烘潃鏀粯绾跨▼锛岀粨鏋滆鍗曠姸鎬佸拰搴撳瓨鏁板涓嶄笂锛岀洿鎺ユ崯澶?涓囪鍗曟暟鎹€?/p>


馃洜锔?绗竴寮忥細interrupt()鐨勬纭Э鍔?/h3>

鈥?strong>鈥嬧€渋nterrupt涓嶅氨鏄彂涓€氱煡鍚楋紵鑳介《鍟ョ敤锛熲€濃€?/strong>鈥?鏂版墜甯告湁鐨勮瑙o紒鐪嬭繖娈典唬鐮佷綘灏辨噦浜嗭細

java澶嶅埗
Thread worker = new Thread(() -> {
    try {
        while(!Thread.interrupted()) { // 閲嶇偣鍦ㄨ繖锛?/span>
            // 鍋囪鍦ㄨ鐪熷伐浣?/span>
            Thread.sleep(1000); 
        }
    } catch (InterruptedException e) {
        System.out.println("鏀跺埌閫氱煡锛岄┈涓婃敹宸ワ紒");
    }
});

// 瑕佸叧闂椂锛?/span>
worker.interrupt(); // 杩欐墠鏄纭搷浣?/span>

鈥?strong>鈥嬩笁涓繀鐭ヨ鐐光€?/strong>鈥嬶細

  1. 璋冪敤interrupt()鈥?strong>鈥嬩笉浼氱珛鍗冲仠姝㈢嚎绋嬧€?/strong>鈥嬶紝鍙槸鎵撲釜鏍囪锛堝氨鍍忕彮涓讳换鏁查粦鏉匡級
  2. 閬囧埌sleep/wait/join鏃讹紝浼氣€?strong>鈥嬫姏InterruptedException鈥?/strong>鈥嬶紙璁板緱catch澶勭悊锛侊級
  3. 鐢?code>Thread.interrupted()浼氣€?strong>鈥嬫竻闄や腑鏂姸鎬佲€?/strong>鈥嬶紝绗簩娆¤皟鐢ㄨ繑鍥瀎alse

涓婁釜鏈堝府浜鸿皟璇曠殑鍧戯細鏈変釜灏忓摜鍦╟atch鍧楅噷娌″啓return锛岀粨鏋滅嚎绋嬩腑鏂悗鍙堢户缁窇锛孋PU鐩存帴椋欏埌100%銆?/p>


鈿欙笍 绗簩寮忥細鏍囧織浣嶅疄鎴樺璺?/h3>

鈥?strong>鈥嬧€渧olatile鏄暐锛熶笉鐢ㄨ涓嶈锛熲€濃€?/strong>鈥?鍏堢湅杩欐鏀硅壇浠g爜锛?/p>

java澶嶅埗
class SafeWorker implements Runnable {
    private volatile boolean running = true; // 鐏甸瓊鍦ㄨ繖锛?/span>

    public void run() {
        while(running) { // 寰幆鏉′欢甯﹂€€鍑哄紑鍏?/span>
            // 澶勭悊涓氬姟閫昏緫...
        }
        System.out.println("瀹夊叏閫€鍑?);
    }

    void stop() {
        running = false; // 浼橀泤鍏抽棴
    }
}

鈥?strong>鈥嬩负浠€涔堝繀椤诲姞volatile鈥?/strong>鈥嬶紵

  • 涓嶅姞鐨勮瘽锛屼富绾跨▼淇敼running鍙橀噺锛屽伐浣滅嚎绋嬪彲鑳解€?strong>鈥嬫案杩滅湅涓嶅埌鍙樺寲鈥?/strong>鈥?/li>
  • 灏卞儚鍔炲叕瀹ょ殑绌鸿皟寮€鍏筹紝濡傛灉閬ユ帶鍣ㄤ俊鍙蜂紶涓嶅埌绌鸿皟锛屼綘鎸夊叧鏈洪敭鏈夊暐鐢紵

瀹炴祴鏁版嵁锛氭煇鐗╂祦绯荤粺鏀圭敤volatile鏍囧織浣嶅悗锛岀嚎绋嬪叧闂€楁椂浠庡钩鍧?绉掗檷鍒?0姣鍐呫€?/p>


馃 interrupt() vs 鏍囧織浣嶏紝鎬庝箞閫夛紵

锛堟帍鍑烘墜鏈哄蹇樺綍锛岀炕鍑哄姣旇〃锛?/p>

鈥?strong>鈥嬪満鏅€?/strong>鈥?/th>鈥?strong>鈥媔nterrupt()鈥?/strong>鈥?/th>鈥?strong>鈥嬫爣蹇椾綅鈥?/strong>鈥?/th>
绾跨▼澶勪簬闃诲鐘舵€?/td>鉁?鐩存帴瑙﹀彂寮傚父鉂?鏃犳硶绔嬪嵆鐢熸晥
CPU瀵嗛泦鍨嬩换鍔?/td>鉂?闇€瑕佷富鍔ㄦ鏌?/td>鉁?鑷劧閫€鍑哄惊鐜?/td>
绗笁鏂瑰簱灏佽鉂?鍙兘涓嶅搷搴斾腑鏂?/td>鉁?鑷富鎺у埗
闇€瑕佸尯鍒嗗绉嶅叧闂師鍥?/td>鉂?鍙兘浼犻€掍腑鏂姸鎬?/td>鉁?鍙畾涔夊涓姸鎬佸彉閲?/td>

鍘诲勾鍋氱殑鏀粯绯荤粺鍗囩骇锛屾渶鍚庨噰鐢ㄢ€?strong>鈥嬫贩鍚堟柟妗堚€?/strong>鈥嬶細涓婚€昏緫鐢ㄦ爣蹇椾綅鎺у埗寰幆锛岀綉缁淚O鎿嶄綔澶勪富鍔ㄦ鏌nterrupt鐘舵€侊紝瀹岀編瑙e喅鍗℃闂銆?/p>


馃挕 鐙瑙佽В锛堥檮琛€娉暀璁級

甯﹁繃20澶氫釜鏂颁汉鍚庡彂鐜帮紝70%鐨勭嚎绋嬪叧闂棶棰橀兘鏍藉湪杩欎笁涓潙閲岋細

  1. 鈥?strong>鈥媡ry-catch鍚炲紓甯糕€?/strong>鈥嬶紙鐗瑰埆鏄疘nterruptedException锛?/li>
  2. 鈥?strong>鈥嬮潤鎬佸彉閲忓綋鏍囧織浣嶁€?/strong>鈥嬶紙澶氬疄渚嬪満鏅笅鍏ㄤ贡濂楋級
  3. 鈥?strong>鈥嬩互涓鸿皟浜唅nterrupt()灏卞畬浜嬧€?/strong>鈥嬶紙鍏跺疄杩樿閰嶅悎鐘舵€佹鏌ワ級

鏈€绂昏氨鐨勬渚嬭杩囨湁浜虹敤System.exit()鍏崇嚎绋嬧€斺€斿ソ瀹朵紮锛屾暣涓狫VM閮借鎵簡銆?/p>

鏈€杩戠湅鍒颁釜鏁版嵁鎸烘湁鎰忔€濓細鏌愰噾铻嶇郴缁熸妸绾跨▼鍏抽棴鏂瑰紡浠巗top()鏀逛负interrupt+鏍囧織浣嶇粍鍚堟嫵鍚庯紝绯荤粺寮傚父閲嶅惎娆℃暟浠庢棩鍧?娆¢檷鍒版瘡鏈?娆°€傝繖鐜╂剰鐪嬬潃绠€鍗曪紝鍏抽敭鏃跺埢鐪熻兘鏁戝懡鍟婏紒

搜索