一、背景
public static String C = "ABCDEFG";
public static String N = "1234567";
//打印成如下
A1B2C3D4E5F6G7
二、解法
1、使用LockSupport,自己打印之后唤醒另一个程序,然后自己挂起,另一个打印之后唤醒这个,自己挂起
public class CyclicOutput {
public static String C = "ABCDEFG";
public static String N = "1234567";
public static Thread threadC = null;
public static Thread threadN = null;
public static void main(String[] args) throws InterruptedException {
char[] charsC = C.toCharArray();
char[] charN = N.toCharArray();
threadC = new Thread(() -> {
for (int i = 0; i < charsC.length; i++) {
System.out.print(charsC[i]);
LockSupport.unpark(threadN);
LockSupport.park();
}
});
threadN = new Thread(() -> {
for (int i = 0; i < charN.length; i++) {
LockSupport.park();
System.out.print(charN[i]);
LockSupport.unpark(threadC);
}
});
threadC.start();
//Thread.sleep(3000);
threadN.start();
}
}
思考:如果线程2还没锁定,就被唤醒会发生什么?
答:不影响运行结果。 LockSupport.unpark是给线程内部一个标识,说你被唤醒了,当LockSupport.park执行到的时候,会判断一下,如果这个标识是唤醒的,那么是不会挂起的。其次,这个唤醒标识连续执行两次,和唤醒一次是一样的。这几个状态都是需要等线程执行起来之后才管用,如代码最后的那个睡眠就会导致死锁。