技术开发 频道

JAVA学习:线程关闭问题分析与解决

  【IT168技术】java 线程关闭,总的来说有3种:

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

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 */
        }
    }
}

   ②当线程等待某些事件发生而被阻塞,又会发生什么?当然,如果线程被阻塞,它便不能核查共享变量,也就不能停止。这在许多情况下会发生,例如调用 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 }

   ③上面说了,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  }
 
0
相关文章