1.
在潛江等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作按需制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都全網(wǎng)營(yíng)銷推廣,外貿(mào)網(wǎng)站建設(shè),潛江網(wǎng)站建設(shè)費(fèi)用合理。
public class TestShutDownHook {
2.
public TestShutDownHook() {
3.
doShutDownWork();
4.
}
5.
private void doShutDownWork() {
6.
Runtime run=Runtime.getRuntime();//當(dāng)前 Java 應(yīng)用程序相關(guān)的運(yùn)行時(shí)對(duì)象。
7.
run.addShutdownHook(new Thread(){ //注冊(cè)新的虛擬機(jī)來關(guān)閉鉤子
8.
@Override
9.
public void run() {
10.
//程序結(jié)束時(shí)進(jìn)行的操作
11.
System.out.println("程序結(jié)束調(diào)用");
12.
}
13.
});
14.
}
15.
public static void main(String[] args) {
16.
new TestShutDownHook();
17.
for (int i = 0; i 1000; i++) { // 在這里增添您需要處理代碼 }
18.
System.out.println(i);
19.
}
20.
}
21.
}
在Java中,拋出異常之后,如果不對(duì)異常進(jìn)行處理,代碼會(huì)一直往調(diào)用的上層拋,直到線程的執(zhí)行器,如果在這里異常仍然未得到處理,線程將停止執(zhí)行。所以拋出異常后如果不對(duì)異常進(jìn)行處理,后面的代碼將不會(huì)執(zhí)行。
比如以下代碼:
public void testException throws Exception(){
System.out.println("start");
throw new Exception("test exception");
System.out.println("execute ended?");
}最后一行代碼在異常拋出之后,這行代碼是不會(huì)執(zhí)行的。
方案操作如下:
(1)讓程序在一個(gè)單獨(dú)的線程中運(yùn)行,然后在終止時(shí),可以用線程的終止方法來結(jié)束它。
(2)退出Java程序時(shí)盡量不要使用java.lang.System的exit方法。Exit?方法可以終止JVM,從而終止程序,但如果同時(shí)運(yùn)行了另一個(gè)Java程序,使用exit方法就會(huì)讓該程序也關(guān)閉,這顯然不是希望看到的情況!?。。?/p>
要退出Java程序,可以使用destory()退出一個(gè)獨(dú)立運(yùn)行的過程。對(duì)于多線程程序,必須要關(guān)閉各個(gè)非守護(hù)線程。
只有在程序非正常退出時(shí),才使用exit方法退出程序
java線程讓沒執(zhí)行完的run方法提前終止的方法如下:
1.? 使用退出標(biāo)志,使線程正常退出,也就是當(dāng)run方法完成后線程終止。?
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("線程退出!");?
}?
}
2.? 使用stop方法強(qiáng)行終止線程(這個(gè)方法不推薦使用,因?yàn)閟top和suspend、resume一樣,也可能發(fā)生不可預(yù)料的結(jié)果)。?
3.? 使用interrupt方法中斷線程。?
當(dāng)run方法執(zhí)行完后,線程就會(huì)退出。但有時(shí)run方法是永遠(yuǎn)不會(huì)結(jié)束的。如在服務(wù)端程序中使用線程進(jìn)行監(jiān)聽客戶端請(qǐng)求,或是其他的需要循環(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)志終止線程的例子。?
在上面代碼中定義了一個(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的值,?