大体如下:android中Activity开启两个线程,一个Produce线程,一个Customer线程,共享Integer[10]数组,Produce线程不断向数组中写入1000,写满后等待,Customer线程不断清空数组内容,当数组全被清空后,通知Produce线程写入数据,Activity要及时刷新当前Integer数组内容size。
从题意可知,在Java方面,这里涉及到两个线程共享一个数组,也就是说当一个线程在运行操作数组时,另一个线程只能等待,否则将出现竞争状态,即一个线程在运行时,另一个线程只能处于阻塞状态。在Andriod方面,因为在Acitivty中要及时刷新当前Integer数组的内容size,所以在UI主线程中要实时读取Integer的size,这个读取是在主线程完成的,而两个子线程可以把改变的信息通过handler发送到主线程,进而主线程进行解析信息,根据信息显示。
分两种方法实现,一种为比较旧的版本,用到了java旧版本的监听器,另一种使用较新版本的类,这些类内部具有阻塞功能,三个具体的阻塞队列为:ArrayBlockingQueue, LinkBlockingQueue和PriorityBlockingQueue。它们都在urrent的包中。其中,ArrayBlockingQueue使用数组实现阻塞队列。LinkBlockingQueue使用链表实现阻塞队列。
1 利用监听器(monitor)对象:
在activity的xml布局中定义了两个TextView,分别用来显示实时数组大小和写入清楚情况:
[html] view plain copy
定义了一个类Buffer,完成包括write(写入方法)和read(清除方法)。程序中生成了两个状态,分别为notFull和notEmpty,作用具体看程序注解。而uiHandler主要用于主线程和子线程的消息通信。当子线程发生变化之后,通过sendMessage方法发生消息,然后主线程通过CallBack得到Message
[java] view plain copy
然后在acitivty中启动Producer和Customer两个线程,为了方便,只循环了50次。
[java] view plain copy
另外附带一些自定义变量:
[java] view plain copy
运行结果如下:
2 使用ArrayBlockingQueue:
程序如下:
[java] view plain copy
这个比较容易理解,因为ArrayBlockingQueue具有能自行实现阻塞队列
本文发布于:2024-02-03 00:37:08,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170689182947508.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |