zoukankan      html  css  js  c++  java
  • (转)Java 关闭线程的安全方法

    一般情况下,线程在处理完之后,会自动关闭。但当线程中是进行循环操作时,就需要设置一定的条件,来使它安全退出。

    Java 之前有个api函数可以直接关闭线程, stop(), 后来, 取消了. 其替代的方式主要有两种:

    1. 自己加入一个成员变量, 我们在程序的循环里面, 轮流的去检查这个变量, 变量变化时, 就会退出这个线程. 代码示例如下package com.test;

     1 public class StopThread extends Thread {
     2 
     3     private boolean _run = true;
     4     public void stopThread(boolean run) {
     5         this._run = !run;
     6     }
     7 
     8     @Override
     9     public void run() {
    10         while(_run) {
    11         //数据处理
    12         }
    13         //super.run();
    14     }
    15 
    16     public static void main(String[] args) {
    17         StopThread thread = new StopThread();
    18         //开始线程
    19         thread.start();
    20         try {
    21             Thread.sleep(1000);
    22         } catch (InterruptedException e) {
    23             e.printStackTrace();
    24         }
    25         //停止线程
    26         thread.stopThread(true);
    27     }
    28 }
    2. 方法1 虽然可以可以处理好, 不过, 在有阻塞线程的语句的时候往往不能处理好. 比如, 设计到Socket的阻塞语句. 虽然java有提供异步io但是异步io是在程序里不断去查询有没有消息的, 所以耗电量可想而知, 对手机这种设备来说往往不适用.那么阻塞的语句,怎么终止线程呢?Java虽然deprecate了一个stop,但是,提供了interrupt(),这个方法是安全的.  这个中断方法可以将阻塞的线程唤醒过来, 但是注意 他不能将非阻塞的线程中断. 中断的同时,会抛出一个异常InterruptedException. 幸运的是, SocketChannel.connect() .read() 阻塞方法都会接受中断,ClosedByInterruptException.这时我们不轮询变量了, 轮询当前线程是否被中断, 代码package com.test;
     1 public class StopThread extends Thread {
     2 
     3     @Override
     4     public void run() {
     5         try {
     6             System.out.println("start");
     7             while(!this.isInterrupted()) {
     8                 //数据处理
     9             }
    10         } catch (Exception e) {
    11             e.printStackTrace();
    12         }
    13         System.out.println("stop");
    14         //super.run();
    15     }
    16 
    17     public static void main(String[] args) {
    18         StopThread thread = new StopThread();
    19         thread.start();
    20         try {
    21             Thread.sleep(1000);
    22         } catch (InterruptedException e) {
    23             e.printStackTrace();
    24         }
    25 
    26         thread.interrupt();
    27         System.out.println("interrupt");
    28     }
    29 }

    3. Android 在自己的Api中加入了,Process类, 这个类可以直接终结进程, 也就是当前线程所在的JVM. final static void killProcess(int pid)  其中,pid, 可以通过Process.mypid() 获取, 但这样终结的是整个程序, 不是我们所想要的.
  • 相关阅读:
    边框上带有文字
    满屏展示
    javaScript中SetInterval与setTimeout区别
    圆形进度条
    抢购(秒杀)业务的技术要点
    Sybase 动态改变存储过程里查询的数据库
    在Hibernate映射文件里配置Sequence
    初学struts2杂乱笔记
    Struts2的学习链接
    DWR框架在web.xml的完整配置及注释
  • 原文地址:https://www.cnblogs.com/chenbin7/p/2627748.html
Copyright © 2011-2022 走看看