有以下需要:
两个线程,须要打印字母和数字,格局A1B2C3 …
这个问题波及到线程的期待,唤醒,线程间通信等常识。
上面看看实现代码:

办法1 LockSupport

import java.util.concurrent.locks.LockSupport;/** * @author liming * @date 2020/10 * @description 交替打印 A1B2C3 ... */public class AlternatePrint {    static Thread t1 = null, t2 = null;    public static void main(String[] args) {        char[] aI = "1234567".toCharArray();        char[] aC = "ABCDEFG".toCharArray();        t1 = new Thread(new Runnable() {            @Override            public void run() {                for (int i = 0; i < aC.length; i++) {                    // 起始先打印一个字母                    System.out.println(aC[i]);                    // 打印完唤醒t2打印数字                    LockSupport.unpark(t2);                    // 本人阻塞,期待唤醒                    LockSupport.park();                }            }        });        t2 = new Thread(new Runnable() {            @Override            public void run() {                for (int i = 0; i < aI.length; i++) {                    // 起始先阻塞期待                    LockSupport.park();                    // 被唤醒后打印数字                    System.out.println(aI[i]);                    // 唤醒t1                    LockSupport.unpark(t1);                }            }        });        t1.start();        t2.start();    }}

办法2 synchronized

import org.junit.Test;/** * @author liming * @date 2020/10/14 * @description 交替打印 A1B2C3 ... */public class AlternatePrint {    static Thread t1 = null, t2 = null;    /**     * 应用 synchronized     */    @Test    public void alternatePrint() {        Object lock = new Object();        char[] aI = "1234567".toCharArray();        char[] aC = "ABCDEFG".toCharArray();        t1 = new Thread(new Runnable() {            @Override            public void run() {                for (int i = 0; i < aC.length; i++) {                    synchronized (lock) {                        System.out.println(aC[i]);                        lock.notify();                        try {                            lock.wait();                        } catch (InterruptedException e) {                            e.printStackTrace();                        }                    }                }            }        });        t2 = new Thread(new Runnable() {            @Override            public void run() {                for (int i = 0; i < aI.length; i++) {                    synchronized (lock) {                        System.out.println(aI[i]);                        lock.notify();                        try {                            lock.wait();                        } catch (InterruptedException e) {                            e.printStackTrace();                        }                    }                }            }        });        t1.start();        t2.start();    }}

测试后果: