一、JMM模型与volatile详解
二、synchronized原理详解
三、AQS框架详解——AbstractQueuedSynchronizer
四、ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue和DelayQueue学习总结
五、CountDownLatch、CyclicBarrier和Semaphore的比较
java中interruptor理解与使用
Java线程的6种状态及切换
MESI协议:保证可见性,无法保证原子性
中断是通过调用Thread.interrupt()方法来做的. 这个方法通过修改了被调用线程的中断状态来告知那个线程,说它被中断了. 对于非阻塞中的线程, 只是改变了中断状态, 即Thread.isInterrupted()将返回true;对于可取消的阻塞状态中的线程, 比如等待在这些函数上的线程,Thread.sleep(), Object.wait(), Thread.join(), 这个线程收到中断信号后, 会抛出InterruptedException, 同时会把中断状态置回为true.但调Thread.interrupted()会对中断状态进行复位。
代码实例
package com.并发专题.中断;
/**
* @author
* @date 2020/9/27
*
*/
public class TestInterruptor1 extends Thread{
public static void main(String args[]) throws Exception {
TestInterruptor1 thread = new TestInterruptor1();
System.out.println("Starting thread...");
thread.start();
System.out.println("====1===="+thread.getState());
//主线程休息30s
Thread.sleep(3000);
System.out.println("Asking thread to stop...");
/*
* 如果线程阻塞,将不会检查此变量,调用interrupt之后,线程就可以尽早的终结被阻
* 塞状 态,能够检查这一变量。
* */
//thread.stop = true;
/*
* 这一方法实际上完成的是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退
* 出阻塞的状态
* */
thread.interrupt();
System.out.println("====2===="+thread.getState());
Thread.sleep(3000);
System.out.println("Stopping application...");
System.out.println("====3===="+thread.getState());
}
public void run() {
try {
while (!Thread.currentThread().isInterrupted()) {
System.out.println("Thread running...");
//模拟线程被阻塞的情况
Thread.sleep(10000);
System.out.println("===线程被阻塞,改业务无法执行=====");
}
} catch (InterruptedException e) {
// 接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态
System.out.println("Thread interrupted...");
}
System.out.println("Thread exiting under request...");
}
}
输出结果
Starting thread...
====1====RUNNABLE
Thread running...
Asking thread to stop...
====2====TIMED_WAITING
Thread interrupted...
Thread exiting under request...
Stopping application...
====3====TERMINATED