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

经典笔试题:

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.TimeUnit;

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

    public static void main(String[] args) {

        final Test01Container myContainer = new Test01Container();

        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());

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

            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    if (myContainer.size() == 5) {
                        System.out.println("size = 5");
                        break;
                    }
                }

            }
        }).start();

    }
}

class Test01Container {

    volatile 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

猜你喜欢

转载自www.cnblogs.com/gaopengpy/p/12262861.html