Java線程關(guān)閉,總的來說有3種:
1.使用狀態(tài)位,這個(gè)簡單,就不多說了:
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ā)生超時(shí),在超時(shí)期滿之前持續(xù)等待也是不可行和不適當(dāng)?shù)模裕褂媚撤N機(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();
}
}
}
但是上面的代碼或許有些不妥,或許用例子更能把問題說清楚。你怎么知道該代碼段會發(fā)生阻塞?interrupt()函數(shù)到底是什么意思呢?首先說明的是,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.上面說了,interrupt()只能解決InterruptedException的阻塞的線程,那么遇到一些其他的io阻塞怎么處理呢?這個(gè)時(shí)候java都會提供相應(yīng)的關(guān)閉阻塞的辦法。例如,服務(wù)器可能需要等待一個(gè)請求(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();
}
}