迅雷的一笔试题:有一个数组,长度为10,有两个线程,一个往里增加数,一个往外删除数

来源:互联网 发布:面向对象编程 java 编辑:程序博客网 时间:2024/04/29 14:48

题目:有一个数组,长度为10,有两个线程,一个往里增加数,满了则暂停,空了再继续, 一个往外删除数,没有数据时则暂停,有 了再继续。

感觉:很久的笔试了,当时还有点蒙,做不好。现在才想做一下,使用thread的wait()和notify()老是出错,逼得我使用了一惯的作法。

注意:1.线程的挂起与继续。  2.数组的加锁

 

package com.chruan.thread.test;import java.util.ArrayList;import java.util.List;/** * 有一个数组,长度为10,有两个线程,一个往里增加数,满了则暂停,空了再继续, * 一个往外删除数,没有数据时则暂停,有 了再继续。 * @author Administrator * */public class ArrayListThread {public static void main(String[] args) {ArrayListThread a = new ArrayListThread();a.start();}private List<String> arr = new ArrayList<String>(10);private int size = 10;AddThread at = new AddThread();DelThread dt = new DelThread();public void start() {at.start();dt.start();}public boolean add() {boolean s = false;int n;String str = null;synchronized (arr) {if ((n = arr.size()) < 10) {str = "" + n;arr.add(str);s = true;}else {//满了at.start = false;//暂停添加//dt.start = true;//满了才开始删除}dt.start = true;//不空就开始删除}if (s)System.out.println("++" + str);return s;}public boolean del() {boolean s = false;int n;String str = null;synchronized (arr) {if ((n = arr.size()) > 0) {str = arr.remove(0);s = true;}else {//空了dt.start = false;//暂停删除at.start = true;//开始添加}}if (s)System.out.println("--" + str);return s;}class AddThread extends Thread {boolean start = true;@Overridepublic void run() {while (true) {if (start)add();try {sleep(5);} catch (InterruptedException e) {}}}}class DelThread extends Thread {boolean start = true;@Overridepublic void run() {while (true) {if (start)del();try {sleep(5);} catch (InterruptedException e) {}}}}}