【Java面试题】多线程交替打印

数组一:{“1”,“2”,“3”,...,“26”}
数组二:{“A”,“B”,“C”,...,“Z”}

使用两个线程交替打印:“A1B2C3D4E5F6...”

使用LinkedTransferQueue

public static void main(String[] args) {

        final char[] nums = "123456".toCharArray();
        final char[] words = "ABCDEF".toCharArray();

        final LinkedTransferQueue<Object> ltq = new LinkedTransferQueue<>();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (char num : nums) {
                    try {
                        // take方法是个阻塞方法
                        System.out.print(ltq.take());
                        // transfer方法是个阻塞方法
                        ltq.transfer(num);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
        
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (char word : words) {
                    try {
                        // transfer方法是个阻塞方法
                        ltq.transfer(word);
                        // take方法是个阻塞方法
                        System.out.print(ltq.take());
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();

    }

执行结果

A1B2C3D4E5F6

take、transfer均为阻塞方法

LinkedTransferQueue:

  • 容量为0

  • 类似套袖:

  • 左边给右边递(transfer)东西,左边会一直举(阻塞)着,直到右边取(take)走;

  • 左边向右边取(take)东西,左边会一直举(阻塞)着,直到右边交(transfer)出;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。