资讯专栏INFORMATION COLUMN

java并发编程学习之线程的生命周期-interrupt(七)

maxmin / 1926人阅读

摘要:和是配套使用的,方法容易导致死锁。方法不会保证线程的资源正常释放方法给线程打个停止标记,将线程的中断状态设置为,并没有马上强制中断线程,线程是否中断由线程自己决定。终结状态,还是返回。方法判断当前线程是否中断,清除中断标志。

resume、suspend、stop

resume和suspend是配套使用的,suspend方法容易导致死锁。

stop方法不会保证线程的资源正常释放

interrupt

interrupt()方法:给线程打个停止标记,将线程的中断状态设置为true,并没有马上强制中断线程,线程是否中断由线程自己决定。

isInterrupted()方法:判断当前线程是否中断,不清除中断标志。终结状态,还是返回false。

interrupted()方法:判断当前线程是否中断,清除中断标志。

如果抛出异常,中断状态设置为false。

示例 例子1
public class InterruptThread extends Thread {
    @Override
    public void run() {
        while (true) {
        }
    }

    public static void main(String[] args) throws InterruptedException {
        InterruptThread thread = new InterruptThread();
        thread.start();
        System.out.println(thread.getState());
        sleep(1000);
        thread.interrupt();
        System.out.println(thread.getState());
        System.out.println(thread.isInterrupted());
    }
}

运行结果如下

可以看出,虽然中断状态是true了,但是程序依然在运行,所以interrupt并没有强制中断线程。

例子2
public class InterruptThread2 extends Thread {
    @Override
    public void run() {
        while (!isInterrupted()) {
        }
        System.out.println("已中断");
    }

    public static void main(String[] args) throws InterruptedException {
        InterruptThread2 thread = new InterruptThread2();
        thread.start();
        System.out.println(thread.getState());
        sleep(1000);
        thread.interrupt();
        System.out.println(thread.getState());
        System.out.println(thread.isInterrupted());
    }
}

运行结果如下:

跟例子1的区别是,通过判断中断状态,来处理我们自己的业务逻辑,这样的设计,给程序带来了极大的利灵活性。

例子3
public class InterruptWait extends Thread {
    @Override
    public void run() {
        waitFun();
    }

    public synchronized void waitFun(){
        try {
            wait();
        } catch (InterruptedException e) {
            System.out.println("打扰我等待了");
        }

    }

    public static void main(String[] args) throws InterruptedException {
        InterruptWait thread = new InterruptWait();
        thread.start();
        System.out.println(thread.getState());
        sleep(1000);
        thread.interrupt();
        sleep(1000);
        System.out.println(thread.getState());
        System.out.println(thread.isInterrupted());
        sleep(1000);
        System.out.println(thread.getState());
    }
}

运行结果如下:

中断wait方法,这里需要注意的是,抛出异常后,中断状态变成false。

例子4
public class InterruptWait extends Thread {
    @Override
    public void run() {
        waitFun();
    }

    public synchronized void waitFun(){
        try {
            wait();
        } catch (InterruptedException e) {
            System.out.println("打扰我等待了");
        }

    }

    public static void main(String[] args) throws InterruptedException {
        InterruptWait thread = new InterruptWait();
        thread.start();
        System.out.println(thread.getState());
        sleep(1000);
        thread.interrupt();
        sleep(1000);
        System.out.println(thread.getState());
        System.out.println(thread.isInterrupted());
        sleep(1000);
        System.out.println(thread.getState());
    }
}

运行结果如下:

结果同上,抛出异常后,中断状态变成false。

例子5
public class InterruptSync extends Thread {
    @Override
    public void run() {
        syncFun();
    }

    public static synchronized void syncFun() {
        while (true) {
        }
    }

    public static void main(String[] args) throws InterruptedException {
        InterruptSync thread = new InterruptSync();
        InterruptSync thread2 = new InterruptSync();
        thread.start();
        sleep(1000);
        thread2.start();
        sleep(1000);

        System.out.println(thread.getState());
        System.out.println(thread2.getState());

        thread2.interrupt();
        sleep(1000);
        System.out.println(thread2.getState());
        System.out.println(thread2.isInterrupted());

    }
}

运行结果如下:

没有抛异常,结果同例子1。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75248.html

相关文章

  • java并发编程习之线程生命周期-wait,notify,notifyall(六)

    摘要:不释放持有的锁,释放锁。在调用方法前,必须持有锁,调用唤醒,也要持有锁。休眠一定时间后,进入就绪状态。这两个都能被方法中断当前状态。用法方获取锁判断条件,不满足继续满足执行其他业务方获取锁改变条件通知为什么是而不是会一直循环,直到条件满足。 sleep和wait sleep是Thread类的方法,wait是Object的方法。 sleep可以到处使用,wait必须是在同步方法或者代码...

    Terry_Tai 评论0 收藏0
  • java并发编程习之线程生命周期(一)

    摘要:就绪状态调用或者由阻塞状态被解除时,进入就绪状态,此时,只能表示线程可以运行了,但不代表已经运行了,需要等待的调度。死亡状态当线程执行结束或者异常等,线程就会结束,进入死亡状态。 流程图 showImg(https://segmentfault.com/img/bVbuJ6f); 新建状态 当用new创建一个线程后,线程就处于新建状态,此时和其他普通java对象一样,由JVM创建内存空...

    AndroidTraveler 评论0 收藏0
  • java并发编程习之线程生命周期-join(四)

    摘要:定义等待该线程终止,比如线程调用了线程的,那么线程要等到线程执行完后,才可以继续执行。 定义 等待该线程终止,比如A线程调用了B线程的join,那么A线程要等到B线程执行完后,才可以继续执行。 示例 public class JoinDemo { static class JoinThread1 implements Runnable { Thread thre...

    xavier 评论0 收藏0
  • java并发编程习之线程生命周期-start(二)

    摘要:与执行方法,是用来启动线程的,此时线程处于就绪状态,获得调度后运行方法。执行方法,相对于普通方法调用,在主线程调用。程序是顺序执行的,执行完才会执行下面的程序。 start与run 执行start方法,是用来启动线程的,此时线程处于就绪状态,获得调度后运行run方法。run方法执行结束,线程就结束。 执行run方法,相对于普通方法调用,在主线程调用。程序是顺序执行的,执行完才会执行下...

    bigdevil_s 评论0 收藏0
  • java并发编程习之线程生命周期-sleep(五)

    摘要:在指定毫秒数内,让正在执行的当前线程进入休眠期。示例运行结果如下结果可以看出,线程的两次时间相差毫秒,的两次时间相差毫秒,只影响自己的线程运行,不影响其他线程。 sleep 在指定毫秒数内,让正在执行的当前线程进入休眠期。 示例 public class SleepDemo extends Thread { @Override public void run() { ...

    xi4oh4o 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<