要求:
两个线程,一个输出数字,一个输出字母,交替输出以下内容:
代码语言:javascript复制1 A 2 B 3 C 4 D ...26 Z
实现很简单,怎样用最少的代码,最短的时间实现?
构想:
① 创建两个字符数组,一个存放1-26数字,一个存放A-Z字母。
② 创建两个线程,一个线程循环输出数字,一个线程循环输出字母。
③ 先让输出字母线程处于阻塞状态,等待唤醒。
④ 输出数字线程做出一次输出动作后,唤醒字母线程,自己(数字线程)处于阻塞状态,等待唤醒。
⑤ 输出字母线程被唤醒,做出一次输出动作后,唤醒数字线程,自己(字母线程)处于阻塞状态,等待唤醒。
⑥ 如此循环,可实现交替输出内容。
代码:
代码语言:javascript复制/**
* 循环输出1A 2B 3C 4D
*/
public class TestB {
static Thread t1;
static Thread t2;
public static void main(String[] args) throws Exception{
char[] arr1 = "ABCDEFG".toCharArray();
char[] arr2 = "1234567".toCharArray();
t1 = new Thread(() -> {
for (int a=0;a<arr1.length;a ) {
LockSupport.park();//阻塞
System.out.println(arr1[a]);
LockSupport.unpark(t2);//唤醒
}
},"t1");
t2=new Thread(() -> {
for (int b=0;b<arr2.length;b ) {
System.out.println(arr2[b]);
LockSupport.unpark(t1);//唤醒
LockSupport.park();//阻塞
}
},"t2");
t1.start();//启动线程t1
t2.start();//启动线程t2
}
}
关键方法:
LockSupport类:
LockSupport是一个用于线程阻塞的工具类,该类中的方法都是静态方法。可以实现让线程在任意位置阻塞和等待唤醒。
代码语言:javascript复制//两个主要方法:
LockSupport.unpark(t1);//唤醒指定线程
LockSupport.park();//阻塞当前线程