交换输出 字母和数字 多线程 Thread
“ABCDEFG”, “1234567”
重点笔记LockSupport;
LockSupport.unpark(Thread thread);//唤醒并给与thread一个"通行证"
LockSupport.park();//一个关卡,如果没有通行证则让当前线程堵塞,如果有则没收通行证让当前线程继续运行
转自马士兵课上的解决代码:
import java.util.concurrent.locks.LockSupport;
public class ExchangeTread {
static Thread t1=null,t2=null;
public static void main(String[] args) {
char[] Ti = "123456789".toCharArray();
char[] Tc = "abcdefghi".toCharArray();
t1 = new Thread(() -> {
for (char c : Ti) {
System.out.println(c);
LockSupport.unpark(t2);
LockSupport.park();
}
LockSupport.unpark(t2);
});
t2 = new Thread(() -> {
for (char c : Tc) {
LockSupport.park();
System.out.println(c);
LockSupport.unpark(t1);
}
LockSupport.unpark(t1);
});
t1.start();
t2.start();
}
分析如下:
首先必须明白两点:
第一通行证每个线程最多拿一个,不管另外一个线程调用多少次LockSupport.unpark()这个线程只能有一个通行证。
第二每个关卡LockSupport.park()放行时没收一张通行证,下一个关卡就没了,也就是说调用两次LockSupport.park()此线程一定堵塞。
当t2先运行时:
碰到LockSupport.park()由于没有通行证就让t2线程的程序堵塞.
此时由于t1处于争抢cpu状态,就轮到t1运行,
当t1先运行时:
System.out.println()输出数字“1”接着LockSupport.unpark(t2)唤醒t2线程同时给t2发一个通行证,然后LockSupport.park()让t1自己过关卡,由于没有自己的通行证进入堵塞状态,与此同时被唤醒的t2碰到LockSupport.park()由于自己有从t1发来的通行证程序继续运行System.out.println()输出字母“a”,然后唤醒t1并给t1一个通行证,于是t1可以通过上次让自己堵塞的关卡进入循环然后System.out.println()继续输出数字“2”接着LockSupport.unpark(t2)唤醒t2重复上面过程。
最后不管t1,t2谁先结束循环,为保证让两个线程顺利结束需要继续运行程序因此用LockSupport.unpark()互相唤醒对方。
萌新第一次博客,欢迎大佬轻喷批评指正。