• 正确停止线程(四)


    1.使用interrupt关闭线程

    /**
    * 使用interrupt关闭线程,注意不可强制,而是要判断true如果当前线程已被中断; false除此以外。!Thread.currentThread().isInterrupted()
    */
    public class RightWayStopThreadWithoutSleep implements Runnable{
    @Override
    public void run() {
    int num = 0;
    while (!Thread.currentThread().isInterrupted() && num<=Integer.MAX_VALUE /2){
    if(num%10000==0){
    System.out.println(num+"是1000的倍数");
    }
    num++;
    }
    System.out.println("结束啦");
    }
    public static void main(String[] args) throws InterruptedException {
    Thread thread = new Thread(new RightWayStopThreadWithoutSleep());
    thread.start();
    Thread.sleep(1000);
    thread.interrupt();
    }
    }

    2.堵塞状态中断的方式是抛出异常:

     1.循环里面使用了Thread.sleep(1000);代表每次运行都延迟1s,最下面的5s是整个线程运行5s然后会抛出异常结束线程
    2.循环里面可以不用Thread.currentThread().isInterrupted()来判断线程是否要到点关闭了

    /**
    * 如果在执行过程中,每次循环都会调用sleep或wait等方法,那么不需要每次迭代都检查是否已中断
    */
    public class RightWayStopThreadWithSleepEveryLoop {
    public static void main(String[] args) throws InterruptedException {
    Runnable runnable = ()->{
    int num = 0;
    try {
    while (num<=10000000){
    if (num%10 ==0){
    System.out.println(num+"是10的倍数");
    }
    num+=10;
    Thread.sleep(1000);
    System.out.println("hhh");
    }
           } catch (InterruptedException e) {
    e.printStackTrace();
    }
    };
    Thread thread = new Thread(runnable);
    thread.start();
    Thread.sleep(5000);
    thread.interrupt();

    }
    }

     

    3.把try-catch放在while里面堵塞状态中断会失效:

    4.把try-catch放在while里面堵塞状态中断会失效怎么办?:1.传递中断

    1.这里try-catch还是在while里面,最好是在catch里面做出选择停止线程,这个demo是把休息时间放在了throwInMethod这个方法里面,也try-catch了,但是呢

    /**
    * 最佳时间 catch了InterruptedEcxetion之后的优先选择
    * :在方法签名中抛出异常
    * 那么在run()就会强制try/catch
    */
    public class RightWayStopThreadInProd implements Runnable{
    @Override
    public void run() {
    while (true && !Thread.currentThread().isInterrupted()){
    System.out.println("我来啦");
    new RightWayStopThreadInProd().throwInMethod();
    }
    }
    private void throwInMethod(){
    try {
    Thread.sleep(2000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    public static void main(String[] args) throws InterruptedException {
    Thread thread = new Thread(new RightWayStopThreadInProd());
    thread.start();
    Thread.sleep(5000);
    thread.interrupt();
    }
    }

    2.这里try-catch还是在while里面,最好是在catch里面做出选择停止线程,这个demo是把休息时间放在了throwInMethod这个方法里面,也try-catch了,但是呢try-catch是在使用的地方try-catch的这样可以根据不同的需求做不同的处理
    /**
    * 最佳时间 catch了InterruptedEcxetion之后的优先选择
    * :在方法签名中抛出异常
    * 那么在run()就会强制try/catch
    */
    @Slf4j
    public class RightWayStopThreadInProd implements Runnable{
    @Override
    public void run() {
    while (true && !Thread.currentThread().isInterrupted()){
    System.out.println("我来啦");
    try {
    new RightWayStopThreadInProd().throwInMethod();
    } catch (InterruptedException e) {
    log.error("我在这中断了,我要看我跳出来了之后干嘛",e.getMessage());
    break;
    }
    }
    }
    private void throwInMethod() throws InterruptedException {
    Thread.sleep(2000);
    }
    public static void main(String[] args) throws InterruptedException {
    Thread thread = new Thread(new RightWayStopThreadInProd());
    thread.start();
    Thread.sleep(5000);
    thread.interrupt();
    }
    }

    5.把try-catch放在while里面堵塞状态中断会失效怎么办?:2.恢复中断

    既然是因为每次catch之后会把interrupt给清掉,导致无法获取是否中断,那么在catch中:Thread.currentThread().interrupt();实现中断就可以了

  • 相关阅读:
    从string类的实现看C++类的四大函数 [写的很好]
    毕业5年决定你的命运
    git push 原因以及问题!
    poj 1195 Mobile phones 夜
    poj 2886 Who Gets the Most Candies 夜
    poj Asimple Problem With Integers 夜
    poj 2750 Potted Flower 夜
    poj 2528 Mayor's posters 夜
    poj 2777 Count Color 夜
    poj 2482 Stars in Your Window 夜
  • 原文地址:https://www.cnblogs.com/chwl-ljx/p/15500219.html
Copyright © 2020-2023  润新知