阿里多线程面试题

2022-05-13 14:25:06 浏览数 (1)

要求:

两个线程,一个输出数字,一个输出字母,交替输出以下内容:

代码语言: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();//阻塞当前线程

0 人点赞