前言
最近在阅读JUC包的源码,里面也出现了大量的Interrupt语句,我们来了解一下Interrupt的具体用法吧。
用法介绍
Interrupt,意为中断。在Java中,主要有 interrupted()、isInterrupted()、interrupt()。
- interrupt():这个方法是Thread的实例方法,在一个线程中调用另外一个线程的interrupt()方法,会向那个线程发送中断信号,并且线程的中断状态被设置为true。至于被中断的线程何去何从,则由具体的代码去进行实现。
- interrupted():用来判断当前线程的中断状态,并且会重置线程的中断状态。
- isInterrupted(): 用来判断当前线程的中断状态,不会重置线程的中断状态。
Demo
上面代码的输出结果:
以上便是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的全部用法介绍了。