zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Java线程关闭的3种方法

2023-06-13 09:15:06 时间

Java线程关闭,总的来说有3种:

1.使用状态位,这个简单,就不多说了:

复制代码代码如下:

publicclassTaskextendsThread{

privatevolatilebooleanflag=true;

publicvoidstopTask(){

flag=false;

}

@Override

publicvoidrun(){

while(flag){

/*doyourno-blocktask*/

}

}

}


2.当线程等待某些事件发生而被阻塞,又会发生什么?当然,如果线程被阻塞,它便不能核查共享变量,也就不能停止。这在许多情况下会发生,例如调用Object.wait()、Thread.sleep等,这里仅举出一些。他们都可能永久的阻塞线程。即使发生超时,在超时期满之前持续等待也是不可行和不适当的,所以,要使用某种机制使得线程更早地退出被阻塞的状态。这个时候你可以使用
复制代码代码如下:

Thread.interrupt();

publicclassBlockTaskextendsThread{

@Override

publicvoidrun(){

try{

while(!Thread.interrupted()){

/*doyourblocktask*/

}

}catch(Exceptione){

e.printStackTrace();

}

}

}


但是上面的代码或许有些不妥,或许用例子更能把问题说清楚。你怎么知道该代码段会发生阻塞?interrupt()函数到底是什么意思呢?首先说明的是,interrupted()方法只能解决跑出InterruptedException异常的阻塞。而interrupt()并不是关闭阻塞线程,而是解除阻塞。那这里就举出一个关闭线程阻塞的例子:
复制代码代码如下:
publicclassBlockTaskextendsThread{

@Override

publicvoidrun(){

try{

sleep(10000);

}catch(InterruptedExceptione){

System.out.println("ifyoutuseinterruptyouwillseeme");

}


}

publicstaticvoidmain(String[]args)throwsException{

//TODOAuto-generatedmethodstub

BlockTasktask=newBlockTask();

task.start();

Thread.sleep(1000);

task.interrupt();


}

}


3.上面说了,interrupt()只能解决InterruptedException的阻塞的线程,那么遇到一些其他的io阻塞怎么处理呢?这个时候java都会提供相应的关闭阻塞的办法。例如,服务器可能需要等待一个请求(request),又或者,一个网络应用程序可能要等待远端主机的响应,这个时候可以使用套接字close()方法
复制代码代码如下:
publicclassSocketTaskextendsThread{

privatevolatileServerSocketserver;


publicvoidstopTask(){

try{

if(server!=null){

server.close();

System.out.println("closetasksuccessed");

}

}catch(IOExceptione){

System.out.println("closetaskfailded");

}

}

@Override

publicvoidrun(){

try{

server=newServerSocket(3333);

}catch(IOExceptione){

e.printStackTrace();

}

}

publicstaticvoidmain(String[]args)throwsInterruptedException{


SocketTasktask=newSocketTask();

task.start();

Thread.sleep(1000);

task.stopTask();

}

}