首页 > 趣闻 > 正文内容

如何优雅终止Java线程?interrupt与状态检查结合实践

趣闻2025-05-19 11:54:55

鈥?strong>鈥嬧€滄湁娌℃湁閬囧埌杩囩嚎绋嬪儚鑴辩及鐨勯噹椹竴鏍峰仠涓嶄笅鏉ワ紵鈥濃€?/strong>鈥?br/> 鐩镐俊涓嶅皯鍒氬Java鐨勫皬浼欎即閮借俯杩囪繖涓潙锛氭槑鏄庤皟鐢ㄤ簡stop()鏂规硶锛岀粨鏋滅▼搴忕洿鎺ュ穿浜嗭紱鎴栬€呰缃簡鏍囧織浣嶏紝浣嗙嚎绋嬪崱鍦?code>sleep()閲屾娲讳笉鍝嶅簲鈥︿粖澶╁挶浠氨鏉ュ敔鍞狅紝鎬庝箞鐢ㄢ€?strong>鈥媔nterrupt鍜岀姸鎬佹鏌モ€?/strong>鈥嬭繖瀵归粍閲戞惌妗o紝璁╃嚎绋嬩紭闆呪€滈€€浼戔€濄€?/p>


涓€銆佷负浠€涔堜笉鑳界洿鎺ョ敤stop鏉€绾跨▼锛?/h3>

锛堣嚜闂嚜绛旂幆鑺傦級
鈥?strong>鈥婹锛氱綉涓婃湁浜鸿鐢╰hread.stop()灏辫兘缁堟锛屼负鍟ユ暀绋嬮兘涓嶆帹鑽愶紵鈥?/strong>鈥?br/> A锛氬厔寮燂紝杩欐柟娉曟棭灏辫Java瀹樻柟鏍囦负鈥?strong>鈥婡Deprecated锛堝凡搴熷純锛夆€?/strong>鈥嬩簡锛佷妇涓牀瀛愷煂帮細鍋囪绾跨▼姝e湪鍐欐枃浠讹紝浣犵獊鐒朵竴宸存帉鎷嶆瀹冿紙stop锛夛紝鏂囦欢鍙兘鍙啓浜嗕竴鍗婏紝鐢氳嚦鎶婃枃浠跺彞鏌勬悶涓簡鈥斺€旇繖灏卞彨鈥?strong>鈥嬭祫婧愭硠婕忊€?/strong>鈥嬶紝璺熺敤瀹岄┈妗朵笉鍐叉按涓€涓亾鐞嗐€?/p>

鈥?strong>鈥嬪垝閲嶇偣鈥?/strong>鈥嬶細

  • 鈥?strong>鈥媠top()浼氭毚鍔涢噴鏀剧嚎绋嬫寔鏈夌殑鎵€鏈夐攣鈥?/strong>鈥嬶紝瀹规槗瀵艰嚧鏁版嵁涓嶄竴鑷?/li>
  • 鈥?strong>鈥嬩笉浼氭墽琛宖inally浠g爜鍧椻€?/strong>鈥嬶紝璧勬簮閲婃斁鐩存帴娉℃堡
  • 瀹樻柟鏂囨。鍘熻瘽锛氣€淭his method is inherently unsafe.鈥?/li>

浜屻€乮nterrupt鍒板簳鏄釜鍟ユ搷浣滐紵

锛堢敤鐢熸椿鍦烘櫙绫绘瘮锛?br/> 鎯宠薄浣犺鍙啋涓€涓潯鐫€鐨勪汉锛宨nterrupt灏卞儚鈥?strong>鈥嬭交杞绘媿浠栬偐鑶€鈥?/strong>鈥嬶紝鑰屼笉鏄竴鐩嗗喎姘存臣杩囧幓銆傚畠鐨勬牳蹇冨氨涓や釜鍔ㄤ綔锛?/p>

  1. 鈥?strong>鈥嬭缃腑鏂爣蹇椾綅鈥?/strong>鈥嬶細thread.interrupt()
  2. 鈥?strong>鈥嬫鏌ユ爣蹇椾綅鈥?/strong>鈥嬶細Thread.currentThread().isInterrupted()

鈥?strong>鈥嬩妇涓唬鐮佷緥瀛愨€?/strong>鈥嬶細

java澶嶅埗
public void run() {
    while (!Thread.currentThread().isInterrupted()) {
        try {
            // 骞叉椿浠g爜...
            Thread.sleep(1000); // 杩欓噷瀹规槗韪╁潙锛?/span>
        } catch (InterruptedException e) {
            // 閲嶇偣鏉ヤ簡锛佽繖閲屽繀椤婚噸鏂拌缃腑鏂爣蹇?/span>
            Thread.currentThread().interrupt();
            break;
        }
    }
    System.out.println("绾跨▼鏀舵嬀琛屾潕鍑嗗涓嬬彮~");
}

鈥?strong>鈥嬮伩鍧戞寚鍗椻€?/strong>鈥嬶細

  • 濡傛灉绾跨▼鍦?code>sleep()銆?code>wait()鏃惰涓柇锛屼細鈥?strong>鈥嬫竻闄や腑鏂姸鎬佲€?/strong>鈥嬪苟鎶涘紓甯?/li>
  • 鈥?strong>鈥媍atch鍧楅噷蹇呴』鍐嶆璋冪敤interrupt()鈥?/strong>鈥嬶紝鍚﹀垯涓嬫寰幆妫€娴嬩笉鍒颁腑鏂?/li>
  • 鐢?code>isInterrupted()鑰屼笉鏄?code>interrupted()锛堝悗鑰呬細閲嶇疆鏍囧織浣嶏級

涓夈€佹爣蹇椾綅鍜宨nterrupt鍒板簳鐢ㄥ摢涓紵

锛堝姣旇〃鏍艰棌鍦ㄦ枃瀛楅噷锛?br/> 寰堝鏁欑▼浼氭暀浣犵敤volatile boolean鏍囧織浣嶏紝杩欐柟娉曠‘瀹炵畝鍗曪紝浣嗛亣鍒伴樆濉炴搷浣滃氨鎶撶瀻銆傚挶浠洿鎺ヤ笂瀵规瘮锛?/p>

鈥?strong>鈥嬪満鏅€?/strong>鈥?/th>鈥?strong>鈥媣olatile鏍囧織浣嶁€?/strong>鈥?/th>鈥?strong>鈥媔nterrupt鈥?/strong>鈥?/th>
绾跨▼姝e湪杩愯鏅€氫唬鐮?/td>鉁?绔嬪嵆鐢熸晥鉁?闇€涓诲姩妫€鏌?/td>
绾跨▼姝e湪sleep()鉂?鏃犳硶鍞ら啋鉁?瑙﹀彂InterruptedException
闇€瑕侀噴鏀鹃攣鍜岃祫婧?/td>鉂?涓嶅彲闈?/td>鉁?閰嶅悎finally鏇村畨鍏?/td>
绾跨▼姹犵鐞?/td>鉂?闅句互鎺у埗鉁?鍘熺敓鏀寔shutdownNow()

鈥?strong>鈥嬩釜浜鸿鐐光€?/strong>鈥嬶細鈥?strong>鈥媔nterrupt鎵嶆槸浜插効瀛愭柟妗堚€?/strong>鈥嬶紝鏍囧織浣嶉€傚悎绠€鍗曞満鏅€備絾涓よ€呬笉鍐茬獊锛屽彲浠ュ儚杩欐牱缁勫悎浣跨敤锛?/p>

java澶嶅埗
private volatile boolean stopped = false;

public void run() {
    while (!stopped && !Thread.currentThread().isInterrupted()) {
        // 鍙岄噸淇濋櫓
    }
}

鍥涖€佸疄鎴橈紒澶勭悊閭d簺椤藉浐鐨勯樆濉炴搷浣?/h3>

锛堟柊鎵嬫渶甯稿崱浣忕殑鐐癸級
鈥?strong>鈥婹锛氭垜鐨勭嚎绋嬪崱鍦⊿ocket.accept()涓嶅姩浜嗭紝鎬庝箞涓柇锛熲€?/strong>鈥?br/> 杩欐椂鍊欏厜闈犳爣蹇椾綅娌″嵉鐢紝蹇呴』鐢╥nterrupt+鍏抽棴搴曞眰璧勬簮锛?/p>

java澶嶅埗
// 鏈嶅姟绔洃鍚唬鐮佺ず渚?/span>
public void run() {
    while (!Thread.interrupted()) {
        try {
            Socket client = serverSocket.accept();
            process(client);
        } catch (IOException e) {
            // 鍏抽敭锛佹鏌ユ槸涓嶆槸琚腑鏂Е鍙戠殑寮傚父
            if (Thread.currentThread().isInterrupted()) {
                System.out.println("鑰佹澘鍠婃垜涓嬬彮浜嗭紝鍏冲簵鍏冲簵锛?);
                closeServerSocket(); // 鑷繁鍐欑殑鏂规硶
                break;
            }
        }
    }
}

鈥?strong>鈥嬫暡榛戞澘鈥?/strong>鈥嬶細

  • 鍍廠ocket銆佹枃浠禝O杩欑被闃诲鎿嶄綔锛屸€?strong>鈥媔nterrupt涓嶄細鑷姩缁堟鈥?/strong>鈥?/li>
  • 闇€瑕佲€?strong>鈥嬩富鍔ㄥ叧闂簳灞傝祫婧愨€?/strong>鈥嬶紙姣斿璋冪敤serverSocket.close()锛?/li>
  • 鍏抽棴璧勬簮鍚庯紝闃诲鎿嶄綔浼氭姏鍑哄紓甯革紝姝ゆ椂鍐嶆娴嬩腑鏂姸鎬侀€€鍑?/li>

浜斻€佺嚎绋嬫睜鍏抽棴鐨勨€滄爣鍑嗗Э鍔库€?/h3>

锛堝伐浣滀腑鏈€甯哥敤鍦烘櫙锛?br/> 鐢ㄨ繃绾跨▼姹犵殑閮界煡閬擄紝鐩存帴shutdownNow()鍙兘涓换鍔★紝浣嗙瓑shutdown()鍙堟€曠瓑澶箙銆備翰娴嬫湁鏁堢殑鏂规闀胯繖鏍凤細

java澶嶅埗
ExecutorService pool = Executors.newFixedThreadPool(4);

// 绗竴姝ワ細娓╂煍鎻愰啋
pool.shutdown(); 

try {
    // 绗簩姝ワ細绛?鍒嗛挓杩樹笉瀹屼簨灏辩‖鏉?/span>
    if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
        pool.shutdownNow(); 
    }
} catch (InterruptedException e) {
    // 杩炰富绾跨▼閮借涓柇浜嗭紝璧剁揣璺戣矾
    pool.shutdownNow();
    Thread.currentThread().interrupt(); 
}

鈥?strong>鈥嬭娉暀璁€?/strong>鈥嬶細

  • 鍏坰hutdown()闃绘鏂颁换鍔℃彁浜わ紝鈥?strong>鈥嬪凡鎻愪氦鐨勪换鍔$户缁墽琛屸€?/strong>鈥?/li>
  • awaitTermination()瑕佺粰鍚堢悊绛夊緟鏃堕棿锛屽埆鍌荤瓑
  • shutdownNow()鍐呴儴鍏跺疄灏辨槸缁欐墍鏈夌嚎绋嬪彂interrupt

涓汉瑙傜偣锛氫紭闆呭仠鏈烘槸绋嬪簭鍛樼殑蹇呬慨璇?/h3>

骞蹭簡杩欎箞澶氬勾Java锛岃杩囧お澶氬洜涓虹嚎绋嬫病鍏冲ソ瀵艰嚧鐨勫钁゜ug锛氭暟鎹簱杩炴帴姹犵垎婊°€佹棩蹇楁枃浠堕攣姝汇€佸畾鏃朵换鍔¢噸澶嶆墽琛屸€︹€?strong>鈥嬪浼歩nterrupt+鐘舵€佹鏌ワ紝灏卞儚瀛︿細浜嗘€庝箞绀艰矊鍦拌浜虹寮€鈥?/strong>鈥嬧€斺€旀棦杈惧埌鐩殑锛屽張涓嶄激鍜屾皵銆?/p>

璁颁綇涓や釜鏍稿績锛?/p>

  1. 鈥?strong>鈥嬮殢鏃舵鏌ヤ腑鏂姸鎬佲€?/strong>鈥嬶紝鍒绾跨▼瑁呰亱浣滃搼
  2. 鈥?strong>鈥媐inally閲岄噴鏀捐祫婧愨€?/strong>鈥嬶紝灏辩畻琚腑鏂篃瑕佹敹鎷剧儌鎽婂瓙

涓嬫閬囧埌绾跨▼鍏充笉鎺夌殑闂锛屽埆鎬ョ潃鏉€杩涚▼锛屽厛鎯虫兂鏄笉鏄病鐢ㄥソ杩欏榛勯噾缁勫悎銆傛瘯绔燂紝浠g爜濡備汉锛屼紭闆呮案涓嶈繃鏃躲€?/p>

搜索