Java線程關(guān)閉的3種方法
Java線程關(guān)閉,總的來說有3種:
1.使用狀態(tài)位,這個簡單,就不多說了:
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ā)生而被阻塞,又會發(fā)生什么?當(dāng)然,如果線程被阻塞,它便不能核查共享變量,也就不能停止。這在許多情況下會發(fā)生,例如調(diào)用 Object.wait()、Thread.sleep等,這里僅舉出一些。他們都可能永久的阻塞線程。即使發(fā)生超時,在超時期滿之前持續(xù)等待也是不可行和不適當(dāng)?shù)?,所以,要使用某種機制使得線程更早地退出被阻塞的狀態(tài)。這個時候你可以使用
Thread.interrupt();
public class BlockTask extends Thread {
@Override
public void run() {
try {
while (!Thread.interrupted()) {
/* do your block task*/
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
但是上面的代碼或許有些不妥,或許用例子更能把問題說清楚。你怎么知道該代碼段會發(fā)生阻塞?interrupt()函數(shù)到底是什么意思呢?首先說明的是,interrupted()方法只能解決跑出InterruptedException異常的阻塞。而interrupt()并不是關(guān)閉阻塞線程,而是解除阻塞。那這里就舉出一個關(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.上面說了,interrupt()只能解決InterruptedException的阻塞的線程,那么遇到一些其他的io阻塞怎么處理呢?這個時候java都會提供相應(yīng)的關(guān)閉阻塞的辦法。例如,服務(wù)器可能需要等待一個請求(request),又或者,一個網(wǎng)絡(luò)應(yīng)用程序可能要等待遠端主機的響應(yīng),這個時候可以使用套接字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();
}
}
相關(guān)文章
關(guān)于maven配置項目一直提示程序包不存在以及scope的坑
這篇文章主要介紹了關(guān)于maven配置項目一直提示程序包不存在以及scope的坑,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11
windows下使用 intellij idea 編譯 kafka 源碼環(huán)境
這篇文章主要介紹了使用 intellij idea 編譯 kafka 源碼的環(huán)境,本文是基于windows下做的項目演示,需要的朋友可以參考下2021-10-10
Java遞歸調(diào)用如何實現(xiàn)數(shù)字的逆序輸出方式
這篇文章主要介紹了Java遞歸調(diào)用如何實現(xiàn)數(shù)字的逆序輸出方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04
解決java.util.HashMap$Values?cannot?be?cast?to?java.ut的問題
這篇文章主要介紹了解決java.util.HashMap$Values?cannot?be?cast?to?java.ut的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
RestTemplate在Spring或非Spring環(huán)境下使用精講
這篇文章主要為大家介紹了RestTemplate在Spring或非Spring環(huán)境下使用精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-03-03

