经典笔试题:线程通信(使用wait,notify实现线程间通信)
Posted gaopengpy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典笔试题:线程通信(使用wait,notify实现线程间通信)相关的知识,希望对你有一定的参考价值。
经典笔试题:
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; /** * 练习:使用wait,notify实现线程间通信 * 自定义容器,提供新增元素(add)和获取元素数量(size)方法。 * 启动两个线程。线程1向容器中新增10个数据。线程2监听容器元素数量,当容器元素数量为5时,线程2输出信息并终止。 */ public class Test02 { public static void main(String[] args) { final Test02Container myContainer = new Test02Container(); final Object lock = new Object(); new Thread(new Runnable() { @Override public void run() { synchronized (lock) { for (int i = 1; i <= 10; i++) { System.out.println("add Object to Container " + i); myContainer.add(new Object()); if (myContainer.size() == 5) { try { lock.wait(); lock.notifyAll(); } catch (InterruptedException e) { e.printStackTrace(); } } try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } } } } }).start(); new Thread(new Runnable() { @Override public void run() { synchronized (lock) { if (myContainer.size() != 5) { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("size = 5"); lock.notifyAll(); // 唤醒其他等待线程 } } }).start(); } } class Test02Container { 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
以上是关于经典笔试题:线程通信(使用wait,notify实现线程间通信)的主要内容,如果未能解决你的问题,请参考以下文章
从网易的一道多线程笔试题学习wait与notify来控制线程同步
经典笔试题:线程通信(使用CountDownLatch实现线程间通信)