------------------------------第一种实现 LockSupport的park和unpark方法(**重要1**)---------------------------------------------------------------
package com.example.demo.wxyDemo;
import java.util.concurrent.locks.LockSupport;
/**
* 用两个线程,一个输出字母,一个输出数字,交替输出1A2B3C4D...26Z
*/
public class ThreadOrderSwitch {
static Thread t1=null, t2=null;
public static void main(String[] args) {
char[] aI = "123456789".toCharArray();
char[] aC = "ABCDEFGHI".toCharArray();
t1 = new Thread(()->{
for(char c:aI){
System.out.print(c);
LockSupport.unpark(t2);
LockSupport.park();
}
});
t2 = new Thread(()->{
for(char c:aC){
LockSupport.park();
System.out.print(c);
LockSupport.unpark(t1);
}
});
t1.start();
t2.start();
}
}
打印结果:1A2B3C4D5E6F7G8H9ILockSupport
是一个线程阻塞工具类,所有的方法都是静态方法,可以让线程在任意位置阻塞,当然阻塞之后肯定得有唤醒的方法。
为什么叫park呢,park英文意思为停车。我们如果把Thread看成一辆车的话,park就是让车停下,unpark就是让车启动然后跑起来。
类似的还可以用类似自旋锁原理的volatile 和 AtomicInteger
自旋锁示例:原地打转,占用cpu,不放弃cpu,(执行时间短快)不经过操作系统即内核态
相对重量级锁:
atomicInteger
===========================使用阻塞队列操作ArrayBlockingQueue======take()和put()方法阻塞======================
================================**重点2**使用sychnorized,wait,notify方法实现(重要)=====================================
运行结果:1A2B3C... 或者A1B2C3... (任一结果不确定)
循环完了执行notify是为了停止线程,两个交替运行的话,总有一个是wait状态,导致线程无法停止,需要唤醒让线程执行完毕。
想要输出想要的1A2B3C...,可以使用:
(1)countDownLatch,让想要线运行的线程执行输出后latch.countDown(),后运行的线程执行latch.await()
(2)======================**重点3**===============================
使用可重用锁ReenTranLook的创建两个条件condition,(ReenTranLook.newCondition()),可精确的在哪种条件下通知哪些线程运行(重点)