经典笔试题:线程通信(使用CountDownLatch实现线程间通信)

Posted gaopengpy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典笔试题:线程通信(使用CountDownLatch实现线程间通信)相关的知识,希望对你有一定的参考价值。

经典笔试题:

1、自定义容器,提供新增元素(add)和获取元素数量(size)方法。
2、启动两个线程。线程1向容器中新增10个数据。线程2监听容器元素数量,当容器元素数量为5时,线程2输出信息并终止。

package com.gaopeng.programming.test2;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

/**
 * 练习:使用CountDownLatch实现线程间通信
 * 自定义容器,提供新增元素(add)和获取元素数量(size)方法。
 * 启动两个线程。线程1向容器中新增10个数据。线程2监听容器元素数量,当容器元素数量为5时,线程2输出信息并终止。
 */
public class Test03 {

    public static void main(String[] args) {

        final Test03Container myContainer = new Test03Container();
        final CountDownLatch countDownLatch = new CountDownLatch(1);

        new Thread(new Runnable() {
            @Override
            public void run() {

                for (int i = 1; i <= 10; i++) {
                    System.out.println("add Object to Container " + i);
                    myContainer.add(new Object());

                    if (myContainer.size() == 5) {
                        // 门闩-1
                        countDownLatch.countDown();
                    }

                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {

                if (myContainer.size() != 5) {
                    try {
                        // 等待门闩的开放。 不是进入等待队列
                        countDownLatch.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                System.out.println("size = 5");

            }
        }).start();

    }
}


class Test03Container {

    List<Object> container = new ArrayList<>();

    public void add(Object o){
        this.container.add(o);
    }

    public int size() {
        return this.container.size();
    }
}

运行结果如下:

add Object to Container 1
add Object to Container 2
add Object to Container 3
add Object to Container 4
add Object to Container 5
size = 5
add Object to Container 6
add Object to Container 7
add Object to Container 8
add Object to Container 9
add Object to Container 10

以上是关于经典笔试题:线程通信(使用CountDownLatch实现线程间通信)的主要内容,如果未能解决你的问题,请参考以下文章

经典笔试题:线程通信(使用wait,notify实现线程间通信)

经典笔试题:线程通信(使用重入锁(ReentrantLock)和条件队列(Condition)实现线程间通信)

多线程经典笔试题集锦

经典笔试题:两个线程交替打印奇偶数

经典PHP笔试题

Linux运维工程师经典笔试题30道