日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java终止线程的三种方法

發(fā)布時(shí)間:2024/1/23 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java终止线程的三种方法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?有三種方法可以使終止線程。

??? 1.? 使用退出標(biāo)志,使線程正常退出,也就是當(dāng)run方法完成后線程終止。

??? 2.? 使用stop方法強(qiáng)行終止線程(這個(gè)方法不推薦使用,因?yàn)閟top和suspend、resume一樣,也可能發(fā)生不可預(yù)料的結(jié)果)。

??? 3.? 使用interrupt方法中斷線程。


1. 使用退出標(biāo)志終止線程

??? 當(dāng)run方法執(zhí)行完后,線程就會(huì)退出。但有時(shí)run方法是永遠(yuǎn)不會(huì)結(jié)束的。如在服務(wù)端程序中使用線程進(jìn)行監(jiān)聽客戶端請求,或是其他的需要循環(huán)處理的任務(wù)。在這種情況下,一般是將這些任務(wù)放在一個(gè)循環(huán)中,如while循環(huán)。如果想讓循環(huán)永遠(yuǎn)運(yùn)行下去,可以使用while(true){……}來處理。但要想使while循環(huán)在某一特定條件下退出,最直接的方法就是設(shè)一個(gè)boolean類型的標(biāo)志,并通過設(shè)置這個(gè)標(biāo)志為true或false來控制while循環(huán)是否退出。下面給出了一個(gè)利用退出標(biāo)志終止線程的例子。

  • package?chapter2;??
  • ??
  • public?class?ThreadFlag?extends?Thread??
  • {??
  • ????public?volatile?boolean?exit?=?false;??
  • ??
  • ????public?void?run()??
  • ????{??
  • ????????while?(!exit);??
  • ????}??
  • ????public?static?void?main(String[]?args)?throws?Exception??
  • ????{??
  • ????????ThreadFlag?thread?=?new?ThreadFlag();??
  • ????????thread.start();??
  • ????????sleep(5000);?//?主線程延遲5秒??
  • ????????thread.exit?=?true;??//?終止線程thread??
  • ????????thread.join();??
  • ????????System.out.println("線程退出!");??
  • ????}??
  • }??

  • 在上面代碼中定義了一個(gè)退出標(biāo)志exit,當(dāng)exit為true時(shí),while循環(huán)退出,exit的默認(rèn)值為false.在定義exit時(shí),使用了一個(gè)Java關(guān)鍵字volatile,這個(gè)關(guān)鍵字的目的是使exit同步,也就是說在同一時(shí)刻只能由一個(gè)線程來修改exit的值,

    ??? 2. 使用stop方法終止線程

    ??? 使用stop方法可以強(qiáng)行終止正在運(yùn)行或掛起的線程。我們可以使用如下的代碼來終止線程:

  • thread.stop();??

  • 雖然使用上面的代碼可以終止線程,但使用stop方法是很危險(xiǎn)的,就象突然關(guān)閉計(jì)算機(jī)電源,而不是按正常程序關(guān)機(jī)一樣,可能會(huì)產(chǎn)生不可預(yù)料的結(jié)果,因此,并不推薦使用stop方法來終止線程。


    3. 使用interrupt方法終止線程

    ??? 使用interrupt方法來終端線程可分為兩種情況:

    ??? (1)線程處于阻塞狀態(tài),如使用了sleep方法。

    ??? (2)使用while(!isInterrupted()){……}來判斷線程是否被中斷。

    ??? 在第一種情況下使用interrupt方法,sleep方法將拋出一個(gè)InterruptedException例外,而在第二種情況下線程將直接退出。下面的代碼演示了在第一種情況下使用interrupt方法。

  • package?chapter2;??
  • ??
  • public?class?ThreadInterrupt?extends?Thread??
  • {??
  • ????public?void?run()??
  • ????{??
  • ????????try??
  • ????????{??
  • ????????????sleep(50000);??//?延遲50秒??
  • ????????}??
  • ????????catch?(InterruptedException?e)??
  • ????????{??
  • ????????????System.out.println(e.getMessage());??
  • ????????}??
  • ????}??
  • ????public?static?void?main(String[]?args)?throws?Exception??
  • ????{??
  • ????????Thread?thread?=?new?ThreadInterrupt();??
  • ????????thread.start();??
  • ????????System.out.println("在50秒之內(nèi)按任意鍵中斷線程!");??
  • ????????System.in.read();??
  • ????????thread.interrupt();??
  • ????????thread.join();??
  • ????????System.out.println("線程已經(jīng)退出!");??
  • ????}??
  • }??

  • 上面代碼的運(yùn)行結(jié)果如下:


  • 50秒之內(nèi)按任意鍵中斷線程!??
  • ??
  • sleep?interrupted??
  • 線程已經(jīng)退出!???

  • 在調(diào)用interrupt方法后, sleep方法拋出異常,然后輸出錯(cuò)誤信息:sleep interrupted.

    ??? 注意:在Thread類中有兩個(gè)方法可以判斷線程是否通過interrupt方法被終止。一個(gè)是靜態(tài)的方法interrupted(),一個(gè)是非靜態(tài)的方法isInterrupted(),這兩個(gè)方法的區(qū)別是interrupted用來判斷當(dāng)前線是否被中斷,而isInterrupted可以用來判斷其他線程是否被中斷。因此,while (!isInterrupted())也可以換成while (!Thread.interrupted())。



    總結(jié)

    以上是生活随笔為你收集整理的java终止线程的三种方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。