兩個線程分別打印26個字母的元音(a,e,i,o,u) 和輔音(其他),要求按字母序輸出

使用conditionn

public static void main(String[] args) {

        ReentrantLock lock = new ReentrantLock();
        Condition condition1 = lock.newCondition();
        Condition condition2 = lock.newCondition();

        new Thread(() -> {
            int i = 'a';
            while (i <= 'z') {

                lock.lock();

                int[] arr = {'a', 'e', 'i', 'o', 'u'};
                if (juge(arr, i)) {
                    try {
                        i++;

                        condition2.signal();
                        condition1.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }finally {
                        lock.unlock();
                    }
                }

                System.out.println("線程1"+(char)i);
                i++;

            }
        }).start();



        new Thread(() -> {

            lock.lock();
            try {

            int[] arr = {'a', 'e', 'i', 'o', 'u'};
            for (int i : arr) {
                System.out.println("線程2:"+(char)i);
                condition1.signal();
                condition2.await();
            }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
                lock.unlock();
            }
        }).start();


    }

    private static boolean juge(int[] arr, int i) {
        for (int i1 : arr) {
            if (i == i1) {
                return true;
            }
        }
        return false;
    }


注意 ,condition必須要在lock的範圍裏面,不然會狀態異常。java.lang.IllegalMonitorStateException

使用管道,將線程2要打印的數據傳送了過去

 //兩個線程分別打印26個字母的元音(a,e,i,o,u) 和輔音(其他),
    //要求按字母序輸出
    public static void main(String[] args) throws IOException {

        ReentrantLock lock = new ReentrantLock();
        Condition condition1 = lock.newCondition();
        Condition condition2 = lock.newCondition();

        PipedOutputStream out = new PipedOutputStream();
        PipedInputStream input = new PipedInputStream();

        out.connect(input);



        new Thread(() -> {
            int i = 'a';
            while (i <= 'z') {
            lock.lock();
                    int[] arr = {'a', 'e', 'i', 'o', 'u'};
                    if (juge(arr, i)) {
                        try {
                            out.write(i);
                            condition2.signal();
                            condition1.await();
                            i++;
                        } catch (Exception e) {
                            e.printStackTrace();
                        } finally {
                            lock.unlock();
                        }
                    }


                System.out.println("線程1" + (char) i);
                i++;

            }
        }).start();


        new Thread(() -> {

            lock.lock();
            try {
                    while (true) {
                        int i = input.read();
                        System.out.println("線程2:" + (char) i);
                        condition1.signal();
                        condition2.await();
                }

            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                lock.unlock();
            }
        }).start();


    }

    private static boolean juge(int[] arr, int i) {
        for (int i1 : arr) {
            if (i == i1) {
                return true;
            }
        }
        return false;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章