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();
}
}
上一篇: C#实现获取枚举中元素个数的方法