• 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()并不是关闭阻塞线程,而且解除阻塞。那这里就举出一个关闭线程阻塞的例子把:

     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 }

    参考:

    java安全关闭线程

    Java Thread.interrupt 害人! 中断JAVA线程(zz)

    如何让被阻塞的线程销毁?



  • 相关阅读:
    jquer 的简输出
    jQuery 效果999动画 延迟
    Windows Mobile开发环境搭建指南
    使用.NET 框架压缩版开发Windows Mobile 2003 for Smartphone
    SmartPhone 2003 手机编程实战之一[转载]
    Smartphone移动开发—自己开发一个天气预报服务 (转载)
    101个微软提供的Visual Studio 2005示例
    基于 Windows Mobile 的 Pocket PC 和 Smartphone 的开发工具简介
    手机耐用绝对秘密方法
    Cheese 游戏编程:第 4 部分 (转自MSDN)
  • 原文地址:https://www.cnblogs.com/slider/p/2272253.html
Copyright © 2020-2023  润新知