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();
}
}