如何优雅的关闭java线程 java如何关闭线程

Java\u5982\u4f55\u4f18\u96c5\u7684\u7ec8\u6b62\u7ebf\u7a0b

\u5927\u4f53\u662f\u4f7f\u7528boolean \u7c7b\u53d8\u91cf\u53bb\u5224\u65ad\u3001\u8df3\u51fa\u5faa\u73af
~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~

\u5173\u95ed\u7ebf\u7a0b\u6709\u51e0\u79cd\u65b9\u6cd5\uff0c
\u4e00\u79cd\u662f\u8c03\u7528\u5b83\u91cc\u9762\u7684stop()\u65b9\u6cd5
\u53e6\u4e00\u79cd\u5c31\u662f\u4f60\u81ea\u5df1\u8bbe\u7f6e\u4e00\u4e2a\u505c\u6b62\u7ebf\u7a0b\u7684\u6807\u8bb0 \uff08\u63a8\u8350\u8fd9\u79cd\uff09
\u4ee3\u7801\u5982\u4e0b\uff1a
package com.demo;
//\u6d4b\u8bd5Thread\u7684stop\u65b9\u6cd5\u548c\u81ea\u5df1\u7f16\u5199\u4e00\u4e2a\u505c\u6b62\u6807\u8bb0\u6765\u505c\u6b62\u7ebf\u7a0b;
public class StopThread implements Runnable{
//\u505c\u6b62\u7ebf\u7a0b\u7684\u6807\u8bb0\u503cboolean;
private boolean flag = true;
public void stopThread(){
flag = false;
}
public void run(){
int i=0;
while(flag){
i++;
System.out.println(Thread.currentThread().getName()+":"+i);
try{
Thread.sleep(1000);
}catch(Exception e){
}
System.out.println(Thread.currentThread().getName()+"==>"+i);
}
}
public static void main(String args[]){
StopThread st = new StopThread();
Thread th = new Thread(st);
Thread th1 = new Thread(st);
th.start();
th1.start();
try{
Thread.sleep(5500);
}catch(Exception e){
}
/*
\u5982\u679c\u4f7f\u7528Thread.stop\u65b9\u6cd5\u505c\u6b62\u7ebf\u7a0b,\u4e0d\u80fd\u4fdd\u8bc1\u8fd9\u4e2a\u7ebf\u7a0b\u662f\u5426\u5b8c\u6574\u7684\u8fd0\u884c\u5b8c\u6210\u4e00\u6b21
run\u65b9\u6cd5;\u4f46\u662f\u5982\u679c\u4f7f\u7528\u505c\u6b62\u7684\u6807\u8bb0\u4f4d,\u90a3\u4e48\u53ef\u4ee5\u4fdd\u6b63\u5728\u771f\u6b63\u505c\u6b62\u4e4b\u524d\u5b8c\u6574\u7684\u8fd0\u884c\u5b8c
\u6210\u4e00\u6b21run\u65b9\u6cd5;
*/
th.stop();
st.stopThread();
}
}

Java中终止线程的方式主要有三种:

1、使用stop()方法,已被弃用。原因是:stop()是立即终止,会导致一些数据被到处理一部分就会被终止,而用户并不知道哪些数据被处理,哪些没有被处理,产生了不完整的“残疾”数据,不符合完整性,所以被废弃。So, forget it!

2、使用volatile标志位

看一个简单的例子:

首先,实现一个Runnable接口,在其中定义volatile标志位,在run()方法中使用标志位控制程序运行:

public class MyRunnable implements Runnable {  
   
    //定义退出标志,true会一直执行,false会退出循环  
    //使用volatile目的是保证可见性,一处修改了标志,处处都要去主存读取新的值,而不是使用缓存  
    public volatile boolean flag = true;  
   
    public void run() {  
        System.out.println("第" + Thread.currentThread().getName() + "个线程创建");  
           
        try {  
            Thread.sleep(1000L);  
        } catch (InterruptedException e) {  
            e.printStackTrace();  
        }  
           
        //退出标志生效位置  
        while (flag) {  
        }  
        System.out.println("第" + Thread.currentThread().getName() + "个线程终止");  
    }  
}

然后,在main()方法中创建线程,在合适的时候,修改标志位,终止运行中的线程。

public class TreadTest {  
    public static void main(String[] arg) throws InterruptedException {  
        MyRunnable runnable = new MyRunnable();  
           
        //创建3个线程  
        for (int i = 1; i <= 3; i++) {  
            Thread thread = new Thread(runnable, i + "");  
            thread.start();  
        }  
        //线程休眠  
        Thread.sleep(2000L);  
        System.out.println("——————————————————————————");  
        //修改退出标志,使线程终止  
        runnable.flag = false;    
    }  
}

最后,运行结果,如下:

第1个线程创建
第2个线程创建
第3个线程创建
--------------------------
第2个线程终止
第1个线程终止
第3个线程终止

3、使用interrupt()中断的方式,注意使用interrupt()方法中断正在运行中的线程只会修改中断状态位,可以通过isInterrupted()判断。如果使用interrupt()方法中断阻塞中的线程,那么就会抛出InterruptedException异常,可以通过catch捕获异常,然后进行处理后终止线程。有些情况,我们不能判断线程的状态,所以使用interrupt()方法时一定要慎重考虑。

答案来源于我的另一个回答:https://zhidao.baidu.com/question/940530399412929252。



你的线程是循环线程么?否则存在关闭java线程的需要?

  • Java涓浣姝g‘鑰浼橀泤鐨缁堟杩愯涓殑绾跨▼
    绛旓細濡備笅锛绗1涓嚎绋嬪垱寤虹2涓嚎绋嬪垱寤虹3涓嚎绋嬪垱寤---绗2涓嚎绋嬬粓姝㈢1涓嚎绋嬬粓姝㈢3涓嚎绋嬬粓姝3銆佷娇鐢╥nterrupt()涓柇鐨勬柟寮忥紝娉ㄦ剰浣跨敤interrupt()鏂规硶涓柇姝e湪杩愯涓殑绾跨▼鍙細淇敼涓柇鐘舵佷綅锛屽彲浠ラ氳繃isInterrupted()鍒ゆ柇銆傚鏋滀娇鐢╥nterrupt()鏂规硶涓柇闃诲涓殑绾跨▼锛岄偅涔堝氨浼氭姏鍑篒nterruptedException寮傚父锛屽彲...
  • 濡備綍浼橀泤鍦扮粨鏉熶竴涓绾跨▼?
    绛旓細浣跨敤鏍囧織 涓柇绾跨▼銆1.浣跨敤鏍囧織 涓绉嶇畝鍗曠殑鏂规硶鏄娇鐢ㄧ嚎绋嬫潵鎸囩ず绾跨▼鏄惁姝e湪杩愯锛屽苟浣跨敤姝ゆ爣蹇楁牴鎹偍鐨勮姹傞噰鍙栫籂姝f帾鏂斤紝涓嬮潰鏄竴涓ず渚嬩唬鐮侊紝姒傝堪浜嗗浣曚娇鐢ㄦ爣蹇楁潵鏉姝籎ava绾跨▼銆傚湪涓婇潰鐨勪緥瀛愪腑銆傛垜浠彲浠ラ氳繃灏嗚繍琛屽彉閲忚缃负false鏉ユ帶鍒舵墽琛屻傚湪鎴戜滑鐨勭ず渚嬩腑锛屾垜浠娇鐢ˋtomicBoolean浜嗗苟鍙戯紝濡傛灉鎮ㄤ笉鎯充娇鐢...
  • java绾跨▼鍏抽棴鏃朵細鎵ц缁撴潫绾跨▼鐨勬柟娉曞悧
    绛旓細褰撲綘璋冪敤System.exit()鎴栬呴氳繃鍏朵粬鏂瑰紡锛堜緥濡傦細鍦⊿pring Boot搴旂敤涓娇鐢/shutdown绔偣锛夋甯稿叧闂簲鐢ㄦ椂锛孞ava铏氭嫙鏈轰細灏濊瘯鍋滄鎵鏈夌殑闈炲畧鎶ょ嚎绋嬨傚鏋滅嚎绋嬪湪鍚堢悊鐨勬椂闂村唴娌℃湁鍝嶅簲鍋滄璇锋眰锛岄偅涔圝ava铏氭嫙鏈轰細浣跨敤鏇村己纭殑鎵嬫鏉ュ仠姝㈠畠浠備綘鍙互閫氳繃鍦ㄧ嚎绋嬩笂璋冪敤Thread.interrupt()鏂规硶鏉ヤ腑鏂嚎绋嬨傝繖灏嗚缃嚎绋...
  • Java濡備綍鍋滄绾跨▼
    绛旓細2. 浣跨敤stop鏂规硶缁堟绾跨▼ 浣跨敤stop鏂规硶鍙互寮鸿缁堟姝e湪杩愯鎴栨寕璧风殑绾跨▼銆傛垜浠彲浠ヤ娇鐢ㄥ涓嬬殑浠g爜鏉ョ粓姝㈢嚎绋嬶細thread.stop();铏界劧浣跨敤涓婇潰鐨勪唬鐮佸彲浠ョ粓姝㈢嚎绋嬶紝浣嗕娇鐢╯top鏂规硶鏄緢鍗遍櫓鐨勶紝灏辫薄绐佺劧鍏抽棴璁$畻鏈虹數婧愶紝鑰屼笉鏄寜姝e父绋嬪簭鍏虫満涓鏍凤紝鍙兘浼氫骇鐢熶笉鍙鏂欑殑缁撴灉锛屽洜姝わ紝骞朵笉鎺ㄨ崘浣跨敤stop鏂规硶鏉ョ粓姝㈢嚎绋嬨
  • java涓缁堟绾跨▼鐨勬柟娉?
    绛旓細1銆佽绾跨▼鐨剅un()鏂规硶鎵ц瀹岋紝绾跨▼鑷劧缁撴潫銆傦紙杩欑鏂规硶鏈濂斤級2銆侀氳繃杞鍜屽叡浜爣蹇椾綅鐨勬柟娉曟潵缁撴潫绾跨▼锛屼緥濡倃hile(flag){},flag鐨勫垵濮嬪艰涓虹湡锛屽綋闇瑕佺粨鏉熸椂锛宩ava璇剧▼鍩硅鏈烘瀯寤鸿灏唂lag鐨勫艰涓篺alse銆傦紙杩欑鏂规硶涔熶笉寰堝ソ锛屽洜涓哄鏋渨hile(flag){}鏂规硶闃诲浜嗭紝鍒檉lag浼氬け鏁堬級
  • 鎬庢牱鍦java涓叧闂澶绾跨▼鍏朵腑涓涓嚎绋?璁╁叾浠栫嚎绋嬭繕姝e父杩愯?
    绛旓細Thread.currentThread().interrupt(); //杩欎釜鏄幏鍙栧綋鍓绾跨▼骞朵笖涓柇褰撳墠绾跨▼銆俻ublic void interrupt()涓柇绾跨▼濡傛灉褰撳墠绾跨▼娌℃湁涓柇瀹冭嚜宸(杩欏湪浠讳綍鎯呭喌涓嬮兘鏄厑璁哥殑),鍒欒绾跨▼鐨 checkAccess 鏂规硶灏变細琚皟鐢,杩欏彲鑳芥姏鍑 SecurityException銆 濡傛灉绾跨▼鍦ㄨ皟鐢 Object 绫荤殑 wait()銆亀ait(long) 鎴 wait(long, int) 鏂...
  • java绾跨▼濡備綍鍋滄?
    绛旓細閫氳繃璋冪敤interrupt鏂规硶鍙互浣垮緱澶勪簬闃诲鐘舵佺殑绾跨▼鎶涘嚭涓涓紓甯革紝鍗砳nterrupt鏂规硶鍙互鐢ㄦ潵涓柇涓涓澶勪簬闃诲鐘舵鐨勭嚎绋锛涘彟澶栵紝鏀规柟娉曡繕浼氳缃嚎绋嬬殑涓柇鐘舵侊紙娉細isInterrupted()鍙互鐢ㄦ潵鏌ヨ涓柇鐘舵侊級銆傜嚎绋嬮樆濉炲湪reader.readLine()鏃讹紝鍗充娇涓荤嚎绋嬫敼鍙樹簡鏍囧織鍙橀噺锛屼絾鏄苟涓嶈兘绔嬪嵆缁撴潫瀛愮嚎绋嬶紝鍙湁绛夊緟闃诲琚墦鐮...
  • 濡備綍浼橀泤鐨勫叧闂嚎绋姹?
    绛旓細1.閫氳繃@Configuration @Bean娉ㄨВ鍘绘敞鍏ヤ竴涓嚎绋嬫睜<componentThreadPool>銆2.灏嗙嚎绋嬫睜娉ㄥ唽鍒版敞鍐屼腑蹇<ThreadPoolRegistrationCenter> 3.鍦⊿pring瀹瑰櫒鍚姩瀹屾垚瑙傚療鑰呮ā寮忎腑锛屽埄鐢ˋpplicationRunner鎺ュ彛鎻愪緵鐨剅un鏂规硶锛屾坊鍔爅vm hook閽╁瓙锛屼互鍋氬埌jvm閫鍑鏃惰兘澶浼橀泤鍏抽棴绾跨▼姹犮傚叾涓敤鍒颁簡guava鐨<MoreExecutors....
  • Java濡備綍涓柇涓涓鍦ㄨ繍琛鐨勭嚎绋
    绛旓細棣栧厛 蹇樻帀Thread stop鏂规硶 铏界劧瀹冪‘瀹炲仠姝簡涓涓鍦ㄨ繍琛岀殑绾跨▼ 鐒惰 杩欑鏂规硶鏄笉瀹夊叏涔熸槸涓嶅彈鎻愬$殑 杩欐剰鍛崇潃 鍦ㄦ湭鏉鐨凧AVA鐗堟湰涓 瀹冨皢涓嶅瀛樺湪 涓浜涜交鐜囩殑瀹朵紮鍙兘琚彟涓绉嶆柟娉昑hread interrupt鎵杩锋儜 灏界 鍏跺悕绉颁技涔庡湪鏆楃ず钁椾粈涔 鐒惰 杩欑鏂规硶骞朵笉浼氫腑鏂竴涓鍦ㄨ繍琛鐨勭嚎绋(寰呬細灏嗚繘涓姝ヨ鏄) 姝eListing A...
  • 濡備綍缁堟java绾跨▼
    绛旓細interrupt 鏂规硶鏉ヤ腑鏂绛夊緟銆傛湁鍏虫洿澶氫俊鎭紝璇峰弬闃呬负浣曚笉璧炴垚浣跨敤 Thread.stop銆乀hread.suspend 鍜 Thread.resume锛熴侫PI涓婅,濡傛灉浣犵殑绾跨▼鎸佹湁鏌愪釜瀵硅薄閿,鑰屼綘鍗磋皟鐢ㄤ簡stop,鍒欒繖涓璞¢攣姘歌繙涓嶈閲婃斁,鍙兘閫犳垚姝婚攣,鎵浠ヤ綘搴旇鍏堣皟鐢 interrupt() 鍋滄绾跨▼,鍐嶈皟鐢╥sInterrupted()娴嬭瘯鏄惁缁堟,娉ㄦ剰,鍙湁浣...
  • 扩展阅读:java启动线程的方法 ... java创建线程四种方式 ... java线程阻塞怎么解决 ... javascript入门 ... 为什么不建议用多线程 ... 多线程代码示例java ... cpu几核几线程最好 ... 一个初中生学java要多久 ... java线程和进程 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网