使用wait+notify+synchronized
public class T01_00_Question {
public static void main(String[] args) {
//要求用线程顺序打印A1B2C3....Z26
//使用wait+notify+synchronized完成
Object o = new Object();
Thread t1=new Thread(){
@Override
public void run() {
synchronized (o) {
for (int i = 1; i < 27; i++) {
System.out.print(i);
try {
//wait会释放相关锁
//唤醒因wait导致阻塞的t2线程
o.notify();
//使t1线程阻塞
o.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 循环完后不用notify程序不会停止
o.notify();
}
}
};
Thread t2=new Thread(){
@Override
public void run() {
synchronized (o) {
for (int i = 65; i < 91; i++) {
System.out.print((char)i);
try {
//唤醒因wait导致阻塞的t1线程
o.notify();
//使t2线程阻塞
o.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 循环完后不用notify程序不会停止
o.notify();
}
}
};
t1.start();
t2.start();
}
}
使用LockSupport
public class T02_00_LockSupport {
static Thread t1 = null, t2 = null;
public static void main(String[] args) throws Exception {
char[] aI = "1234567".toCharArray();
char[] aC = "ABCDEFG".toCharArray();
t1 = new Thread(() -> {
for(char c : aI) {
System.out.print(c);
LockSupport.unpark(t2); //叫醒T2
LockSupport.park(); //T1阻塞
}
}, "t1");
t2 = new Thread(() -> {
for(char c : aC) {
LockSupport.park(); //t2阻塞
System.out.print(c);
LockSupport.unpark(t1); //叫醒t1
}
}, "t2");
t1.start();
t2.start();
}
}