场景:两个线程的输出顺序需要固定。
synchronized实现:
//使得输出顺序是t1-->t2的固定顺序 打印:首先-->然后
@Slf4j
public class ThreadSo {
//创建锁的对象
static final Object object = new Object();
//创建标记
static Boolean mark = false;
public static void main(String[] args) {
Thread t1 = new Thread(()->{
//线程t1先获取锁,打印【首先】,然后更改mark标记,最后唤醒等待队列里面的线程t2
synchronized (object){
log.debug("首先");
mark = true;
object.notify();
}
});
Thread t2 = new Thread(()->{
synchronized (object){
//获取到对象锁之后 ,判断!mark是否为假,如果为假,就输出t2
while(!mark){
try {
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
log.debug("然后");
}
});
t2.start();
t1.start();
}
}
park&unpark实现:
@Slf4j
public class ThreadSo {
//创建锁的对象
static final Object object = new Object();
//创建标记
static Boolean mark = false;
public static void main(String[] args) {
Thread t1 = new Thread(()->{
//休息
LockSupport.park();
log.debug("然后");
});
Thread t2 = new Thread(()->{
log.debug("首先");
//恢复
LockSupport.unpark(t1);
});
t2.start();
t1.start();
}
}