LockSupport实现交叉打印数组问题

LockSupport 是一个线程阻塞工具类,可以让线程在任意位置阻塞或者唤醒;

问题描述

数组一:123456
数组二:ABCDEF
实现两个数组交叉打印,也就是输出:1A2B3C4D5E6F

解决方法

实现思路:
两个数组,两个线程,一个线程输出完了之后停止,然后让另外一个线程继续运行;
第一个线程t1拿出数组里面的每一个数字来,然后打印,打印完叫醒t2,然后让自己停止。

public class LockSupport {
    static Thread t1 = null, t2 = null;
    public static void main (String[] args) throws Exception{
        char[] aI = "123456".toCharArray();
        char[] aC = "ABCDEF".toCharArray();
        t1 = new Thread(() -> {
            for(char c : aI) {
                System.out.print(c);
                LockSupport.unpark(t2); // 叫醒t2
                LockSupport.park(t1); // 阻塞(停止)t1
            }
        }, "t1");
        t2 = new Thread(() -> {
            for (char c : aC) {
                LockSupport.park(t2); // 阻塞(停止)t2
                System.out.print(c);
                LockSupport.unpark(t1); // 叫醒t1
            }
        }, "t2");
        t1.start();
        t2.start();
    }
}

结果:
在这里插入图片描述
主要方法解析:
park:英译为停车,如果把一个线程比作一辆车,那么park就是停车,停止线程的意思,类似wait。
LockSupport.park(线程名T1),根据指定参数,停止线程T1
unpark:相反,unpark 就是启动线程的意思,类似notify。
LockSupport.unpark(线程名T2),,根据指定参数,恢复线程T2

public static void park(Object blocker); // 根据参数,暂停指定线程
public static void parkNanos(Object blocker, long nanos); // 暂停指定线程,不过有超时时间(单位:纳秒)的限制
public static void parkUntil(Object blocker, long deadline); // 暂停指定线程,直到某个时间(单位:毫秒)
public static void park(); // 无期限暂停当前线程
public static void parkNanos(long nanos); // 暂停当前线程,不过有超时时间(单位:纳秒)的限制
public static void parkUntil(long deadline); // 暂停当前线程,直到某个时间(单位:毫秒)
public static void unpark(Thread thread); // 根据参数,恢复指定线程
public static Object getBlocker(Thread t);

参考文章:
https://www.jianshu.com/p/f1f2cd289205

或者使用Golang的channel也可以实现交叉打印,原理大致相同
https://blog.csdn.net/cxzzxc123456/article/details/81514927

©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页