如何优雅终止Java线程?interrupt与状态检查结合实践
鈥?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>
- 鈥?strong>鈥嬭缃腑鏂爣蹇椾綅鈥?/strong>鈥嬶細
thread.interrupt()
- 鈥?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>
- 鈥?strong>鈥嬮殢鏃舵鏌ヤ腑鏂姸鎬佲€?/strong>鈥嬶紝鍒绾跨▼瑁呰亱浣滃搼
- 鈥?strong>鈥媐inally閲岄噴鏀捐祫婧愨€?/strong>鈥嬶紝灏辩畻琚腑鏂篃瑕佹敹鎷剧儌鎽婂瓙
涓嬫閬囧埌绾跨▼鍏充笉鎺夌殑闂锛屽埆鎬ョ潃鏉€杩涚▼锛屽厛鎯虫兂鏄笉鏄病鐢ㄥソ杩欏榛勯噾缁勫悎銆傛瘯绔燂紝浠g爜濡備汉锛屼紭闆呮案涓嶈繃鏃躲€?/p>