Java線程關(guān)閉的3種方法
Java線程關(guān)閉,總的來(lái)說(shuō)有3種:
1.使用狀態(tài)位,這個(gè)簡(jiǎn)單,就不多說(shuō)了:
public class Task extends Thread {
private volatile boolean flag= true;
public void stopTask() {
flag = false;
}
@Override
public void run() {
while(flag){
/* do your no-block task */
}
}
}
2.當(dāng)線程等待某些事件發(fā)生而被阻塞,又會(huì)發(fā)生什么?當(dāng)然,如果線程被阻塞,它便不能核查共享變量,也就不能停止。這在許多情況下會(huì)發(fā)生,例如調(diào)用 Object.wait()、Thread.sleep等,這里僅舉出一些。他們都可能永久的阻塞線程。即使發(fā)生超時(shí),在超時(shí)期滿(mǎn)之前持續(xù)等待也是不可行和不適當(dāng)?shù)?,所以,要使用某種機(jī)制使得線程更早地退出被阻塞的狀態(tài)。這個(gè)時(shí)候你可以使用
Thread.interrupt();
public class BlockTask extends Thread {
@Override
public void run() {
try {
while (!Thread.interrupted()) {
/* do your block task*/
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
但是上面的代碼或許有些不妥,或許用例子更能把問(wèn)題說(shuō)清楚。你怎么知道該代碼段會(huì)發(fā)生阻塞?interrupt()函數(shù)到底是什么意思呢?首先說(shuō)明的是,interrupted()方法只能解決跑出InterruptedException異常的阻塞。而interrupt()并不是關(guān)閉阻塞線程,而是解除阻塞。那這里就舉出一個(gè)關(guān)閉線程阻塞的例子:
public class BlockTask extends Thread {
@Override
public void run() {
try {
sleep(10000);
} catch (InterruptedException e) {
System.out.println("if yout use interrupt you will see me");
}
}
public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
BlockTask task = new BlockTask();
task.start();
Thread.sleep(1000);
task.interrupt();
}
}
3.上面說(shuō)了,interrupt()只能解決InterruptedException的阻塞的線程,那么遇到一些其他的io阻塞怎么處理呢?這個(gè)時(shí)候java都會(huì)提供相應(yīng)的關(guān)閉阻塞的辦法。例如,服務(wù)器可能需要等待一個(gè)請(qǐng)求(request),又或者,一個(gè)網(wǎng)絡(luò)應(yīng)用程序可能要等待遠(yuǎn)端主機(jī)的響應(yīng),這個(gè)時(shí)候可以使用套接字close()方法
public class SocketTask extends Thread {
private volatile ServerSocket server;
public void stopTask(){
try {
if(server!=null){
server.close();
System.out.println("close task successed");
}
} catch (IOException e) {
System.out.println("close task failded");
}
}
@Override
public void run() {
try {
server = new ServerSocket(3333);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws InterruptedException {
SocketTask task = new SocketTask();
task.start();
Thread.sleep(1000);
task.stopTask();
}
}
- 圖解Java線程的生命周期
- 初步學(xué)習(xí)Java中線程的實(shí)現(xiàn)與生命周期
- java線程之線程的生命周期的使用
- java多線程編程之線程的生命周期
- java 線程的生命周期詳解
- Java 線程的生命周期詳細(xì)介紹及實(shí)例代碼
- Java線程的生命周期和狀態(tài)控制_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- Java線程的生命周期的詳解
- java 實(shí)現(xiàn)線程同步的方式有哪些
- 15個(gè)高級(jí)Java多線程面試題及回答
- Java多線程實(shí)現(xiàn)異步調(diào)用的方法
- Java 線程的生命周期完整實(shí)例分析
相關(guān)文章
Java多線程之同步工具類(lèi)CountDownLatch
這篇文章主要介紹了Java多線程之同步工具類(lèi)CountDownLatch,CountDownLatch是一個(gè)同步工具類(lèi),它允許一個(gè)或多個(gè)線程一直等待,直到其他線程執(zhí)行完后再執(zhí)行。例如,應(yīng)用程序的主線程希望在負(fù)責(zé)啟動(dòng)框架服務(wù)的線程已經(jīng)啟動(dòng)所有框架服務(wù)之后執(zhí)行,下面一起來(lái)學(xué)習(xí)學(xué)習(xí)內(nèi)容吧2021-10-10Intellij無(wú)法創(chuàng)建java文件解決方案
這篇文章主要介紹了Intellij無(wú)法創(chuàng)建java文件解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10java微信公眾號(hào)開(kāi)發(fā)(搭建本地測(cè)試環(huán)境)
這篇文章主要介紹了java微信公眾號(hào)開(kāi)發(fā),主要內(nèi)容有測(cè)試公眾號(hào)與本地測(cè)試環(huán)境搭建,需要的朋友可以參考下2015-12-12Java并發(fā)編程:volatile關(guān)鍵字詳細(xì)解析
這篇文章主要介紹了Java并發(fā)編程:volatile關(guān)鍵字詳細(xì)解析,對(duì)學(xué)習(xí)volatile關(guān)鍵字有一定的認(rèn)識(shí),有需要的可以了解一下。2016-11-11創(chuàng)建一個(gè)Java的不可變對(duì)象
這篇文章主要介紹了創(chuàng)建一個(gè)Java的不可變對(duì)象,一個(gè)類(lèi)的對(duì)象在通過(guò)構(gòu)造方法創(chuàng)建后如果狀態(tài)不會(huì)再被改變,那么它就是一個(gè)不可變(immutable)類(lèi)。它的所有成員變量的賦值僅在構(gòu)造方法中完成,不會(huì)提供任何 setter 方法供外部類(lèi)去修改,需要的朋友可以參考下2021-11-11Java基本數(shù)據(jù)類(lèi)型存儲(chǔ)在JVM中的存儲(chǔ)位置介紹
這篇文章主要介紹了Java基本數(shù)據(jù)類(lèi)型存儲(chǔ)在JVM中的存儲(chǔ)位置,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07