技术开发 频道

Java线程关闭:代码实战总结

        【IT168 技术】总的来说有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()并不是关闭阻塞线程,而是解除阻塞。那这里就举出一个关闭线程阻塞的例子:

 1 public class BlockTask extends Thread {

  
2 @Override

  
3 public void run() {

  
4 try {

  
5 sleep(10000);

  
6 } catch (InterruptedException e) {

  
7 System.out.println("if yout use interrupt you will see me");

  
8 }

  
9

  
10 }

  
11 public static void main(String[] args)throws Exception {

  
12 // TODO Auto-generated method stub

  
13 BlockTask task = new BlockTask();

  
14 task.start();

  
15 Thread.sleep(1000);

  
16 task.interrupt();

  
17

  
18 }

  
19 }

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

1 public class SocketTask extends Thread {

  
2 private volatile ServerSocket server;

  
3

  
4 public void stopTask(){

  
5 try {

  
6 if(server!=null){

  
7 server.close();

  
8 System.out.println("close task successed");

  
9 }

  
10 } catch (IOException e) {

  
11 System.out.println("close task failded");

  
12 }

  
13 }

  
14 @Override

  
15 public void run() {

  
16 try {

  
17 server = new ServerSocket(3333);

  
18 } catch (IOException e) {

  
19 e.printStackTrace();

  
20 }

  
21 }

  
22

  
23 public static void main(String[] args) throws InterruptedException {

  
24

  
25 SocketTask task = new SocketTask();

  
26 task.start();

  
27 Thread.sleep(1000);

  
28 task.stopTask();

  
29 }

  
30

  
31 }

0
相关文章