Java多线程系列--"基础篇"之Interrupt

前言

最近在阅读JUC包的源码,里面也出现了大量的Interrupt语句,我们来了解一下Interrupt的具体用法吧。


用法介绍

Interrupt,意为中断。在Java中,主要有 interrupted()、isInterrupted()、interrupt()。

  • interrupted():这个方法是Thread的实例方法,在一个线程中调用另外一个线程的interrupted()方法,会向那个线程发送中断信号,并且线程的中断状态被设置为true。至于被中断的线程何去何从,则由具体的代码去进行实现。
  • interrupted():用来判断当前线程的中断状态,并且会重置线程的中断状态。
  • isInterrupted(): 用来判断判断当前线程的中断状态,不会重置线程的中断状态。

Demo

Java多线程系列--

上面代码的输出结果:


Java多线程系列--

以上便是interrupted()、isInterrupted()、interrupt()的一些用法。


接下来我们重点来看一下interrupt()的一些用法。

用法一:
public class InterruptCase {
    static Thread mainThread;
    static class InterruptDemo1 implements Runnable{
        @Override
        public void run() {
            int i = 0;
            while (i++ < 100){
                if(Thread.currentThread().isInterrupted()){
                    System.out.println(Thread.currentThread().getName() + "被中断");
                }else {
                    System.out.println( "no" );
                }
            }
            LockSupport.unpark(mainThread);
        }
    }
    @Test
    public void test(){
        mainThread = Thread.currentThread();
        Thread thread = new Thread(new InterruptDemo1());
        thread.start();
        /*只是改变了中断标记而已*/
        thread.interrupt();
        LockSupport.park(mainThread);
        System.out.println(mainThread.getName() + "被唤醒");
    }

我们会发现,调用interrupt()并不能够立即中断正在运行中的线程,它只是改变中断地状态而已。

如果我们想要正确地利用中断,我们可以设置一个开关,这个开关会随着当前线程被中断而打开。

public class InterruptCase {
    static Thread mainThread;
    private static volatile boolean on = false;
    static class InterruptDemo2 implements Runnable{
        @Override
        public void run() {
            while (!on){
                if(Thread.currentThread().isInterrupted()){
                    System.out.println(Thread.currentThread().getName() + "被中断");
                }else {
                    System.out.println( "no" );
                }
            }
            LockSupport.unpark(mainThread);
        }
    }
    @Test
    public void test1() throws InterruptedException {
        mainThread = Thread.currentThread();
        Thread thread = new Thread(new InterruptDemo2());
        thread.start();
        Thread.sleep(1000);
        thread.interrupt();
        on = thread.isInterrupted();
        LockSupport.park(mainThread);
        System.out.println(mainThread.getName() + "被唤醒");
    }
}

这样子就可以快速地响应了中断,结束当前的线程。

用法二:
public class InterruptCase {
    static Thread mainThread;
    static class InterruptDemo3 implements Runnable{
        @Override
        public void run() {
            try {
                Thread.sleep(100000);
            } catch (InterruptedException e) {
                System.out.println("阻塞线程被中断");
            }
            LockSupport.unpark(mainThread);
        }
    }
    @Test
    public void test2() throws InterruptedException {
        mainThread = Thread.currentThread();
        Thread thread = new Thread(new InterruptDemo3());
        thread.start();
        Thread.sleep(1000);
        thread.interrupt();
        on = thread.isInterrupted();
        LockSupport.park(mainThread);
        System.out.println(mainThread.getName() + "被唤醒");
    }
}

那如果当前线程阻塞了,采用开关这种方法就没有什么用武之地了。当时我们还是可以使用interrupt(),来中断当前线程的阻塞。


以上就是interrupt的全部用法介绍了。

你可能感兴趣的:(Java多线程系列--"基础篇"之Interrupt)