多线程练习

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

方式一:

public class Test1 {
    public static void main(String[] args) {
        Test1_Container t = new Test1_Container();
        new Thread(new Runnable() {
            public void run() {
                for (int i = 0; i < 10; i++) {
                    System.out.println("add Object to Container " + i);
                    t.add(new Object());
                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();

        new Thread(new Runnable() {
            public void run() {
                while (true) {
                    if (t.size() == 5) {
                        System.out.println("Container's size = 5");
                        break;
                    }
                }
            }
        }).start();
    }
}

class Test1_Container {
    volatile List<Object> container = new ArrayList<>();

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

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

方式二:

public class Test2 {
    public static void main(String[] args) {
        final Test2_Container t = new Test2_Container();
        final Object lock = new Object();

        new Thread(new Runnable() {
            public void run() {
                synchronized (lock) {
                    if (t.size() != 5) {
                        try {
                            lock.wait(); // 线程进入等待队列。
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println("size = 5");
                    lock.notifyAll(); // 唤醒其他等待线程
                }
            }
        }).start();

        new Thread(new Runnable() {
            public void run() {
                synchronized (lock) {
                    for (int i = 0; i < 10; i++) {
                        System.out.println("add Object to Container " + i);
                        t.add(new Object());
                        if (t.size() == 5) {
                            lock.notifyAll();
                            try {
                                lock.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        try {
                            TimeUnit.SECONDS.sleep(1);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }).start();
    }
}

class Test2_Container {
    List<Object> container = new ArrayList<>();

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

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

方式三:

public class Test3 {
    public static void main(String[] args) {
        Test3_Container t = new Test3_Container();
        CountDownLatch latch = new CountDownLatch(1);// 门闩

        new Thread(new Runnable() {
            public void run() {
                if (t.size() != 5) {
                    try {
                        latch.await();// 等待门闩开启,不是进入等待队列
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("size = 5");
            }
        }).start();

        new Thread(new Runnable() {
            public void run() {
                for (int i = 0; i < 10; i++) {
                    System.out.println("add Object to Container " + i);
                    t.add(new Object());
                    if (t.size() == 5) {
                        latch.countDown();// 门闩-1
                    }
                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
}

class Test3_Container {
    List<Object> container = new ArrayList<>();

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

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

推荐阅读更多精彩内容

  • 本文是我自己在秋招复习时的读书笔记,整理的知识点,也是为了防止忘记,尊重劳动成果,转载注明出处哦!如果你也喜欢,那...
    波波波先森阅读 13,878评论 4 56
  • 几个月下来一直在沉淀,在扎根,也算是不放过每一个学习的机会,在老师的言传身教下,在同修的你追我赶下,最近发现自己上...
    轻瑜伽阅读 1,358评论 0 0
  • 花的美, 不可否认; 叶的绿, 也值得肯定; 但置身污泥浊水, 谁的错? 先别说你多高洁, 出污泥,能不染? 看一...
    微迅阅读 5,004评论 57 44
  • 歌微寨的西面,环着一脉连绵的云圭山。歌微寨的人们埋首耕田时,抬首面西看到的永远是一动不动的云圭山,像被荒置的皮影,...
    收割白日梦阅读 3,552评论 3 1