zoukankan      html  css  js  c++  java
  • 实现两个线程顺序依次打印元素

    public class L_ConditionTest {
        public static void main(String[] args) {
            L_ConditionTest t = new L_ConditionTest();
            // 这两个方法都有问题,假设两个打印的数组长度不对称,那会造成一个线程始终卡死
            t.test();
            t.test2();
            // 那么假设两个数组长度不一致,那该如何处理呢??
        }
        /**
         * 使用 SynchronousQueue 进行线程阻塞
         */
        private void test2() {
            char[] number = "12345678".toCharArray();
            char[] word = "ABCDEfgh".toCharArray();
            SynchronousQueue<String> queue = new SynchronousQueue<>();
            new Thread(() -> {
    
                for (char c : number) {
                    System.out.print(c);
                    try {
                        queue.put("X");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    // 先释放对方 在阻塞自己
                }
    
            }, "t1").start();
    
            new Thread(() -> {
    
                for (char c : word) {
                    try {
                        queue.take();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.print(c);
                }
    
            }, "t2").start();
        }
    
        /**
         * 使用ReentrantLock 的 Condition 
         */
        private void test() {
            char[] number = "123456789".toCharArray();
            char[] word = "ABCDEfgh".toCharArray();
            Lock lock = new ReentrantLock();
            Condition numberCondition = lock.newCondition();
            Condition wordCondition = lock.newCondition();
    
            new Thread(() -> {
    
                lock.lock();
                try {
                    for (char c : number) {
                        System.out.print(c);
                        // 先释放对方 在阻塞自己
                        wordCondition.signalAll();
                        numberCondition.await();
                    }
                    wordCondition.signalAll();
    
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    lock.unlock();
                }
            }, "t1").start();
    
            new Thread(() -> {
                lock.lock();
                try {
                    for (char c : word) {
                        System.out.print(c);
                        numberCondition.signalAll();
                        wordCondition.await();
                    }
                    numberCondition.signalAll();
    
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    lock.unlock();
                }
    
            }, "t2").start();
    
        }
    }
    
  • 相关阅读:
    图像处理笔记(二十一):halcon在图像处理中的运用
    图像处理笔记(二十):LAWS纹理滤波应用于缺陷检测
    图像处理笔记(十九):分类器之高斯混合模型
    图像处理笔记(十八):模板匹配
    图像处理笔记(十七):再看傅里叶变换
    图像处理笔记(十六)
    python列表(list)的技巧及高级操作
    python多线程
    CD/CI的概念
    网络
  • 原文地址:https://www.cnblogs.com/huan30/p/13233146.html
Copyright © 2011-2022 走看看