Java線程封閉的3種辦法。本站提示廣大學習愛好者:(Java線程封閉的3種辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是Java線程封閉的3種辦法正文
Java線程封閉,總的來講有3種:
1.應用狀況位,這個簡略,就不多說了:
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.當線程期待某些事宜產生而被壅塞,又會產生甚麼?固然,假如線程被壅塞,它便不克不及核對同享變量,也就不克不及停滯。這在很多情形下會產生,例如挪用 Object.wait()、Thread.sleep等,這裡僅舉出一些。他們都能夠永遠的壅塞線程。即便產生超時,在超時代滿之前連續期待也是弗成行和不恰當的,所以,要應用某種機制使得線程更早地加入被壅塞的狀況。這個時刻你可使用
Thread.interrupt();
public class BlockTask extends Thread {
@Override
public void run() {
try {
while (!Thread.interrupted()) {
/* do your block task*/
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
然則下面的代碼也許有些不當,也許用例子更能把成績說清晰。你怎樣曉得該代碼段會產生壅塞?interrupt()函數究竟是甚麼意思呢?起首解釋的是,interrupted()辦法只能處理跑出InterruptedException異常的壅塞。而interrupt()其實不是封閉壅塞線程,而是消除壅塞。那這裡就舉出一個封閉線程壅塞的例子:
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都邑供給響應的封閉壅塞的方法。例如,辦事器能夠須要期待一個要求(request),又或許,一個收集運用法式能夠要期待遠端主機的呼應,這個時刻可使用套接字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();
}
}