上节我们讲到如何避免线程中断带来的视觉漏洞,实际上,不足以说明问题,在通过不断的学习和深入思考里,往往能挖掘出更简单更直观的算法和技巧.温故而知新---这话一点都不假.
上两节,我们构造的线程都是通过继承Thread类,实际上,有些时候,我们不能够这么做:假如一个已经继承了另外一个父类的类,你还能让它继承Thread吗?很明显不能.Runnale能为你解决这一难题.甚至可以说,Runnable不仅为你解决java类单继承的缺陷,还能为你解决许多难题,它能使代码更简洁,使思路更清晰.下面,我将前面的生产者/消费者模型用实现Runnable接口的形式来完成.
我们先定义要处理的资源(Box):
public class Box implements Runnable {
private int value;// 要进行读写的值
private boolean available = false;// 开关变量,true即表示value已生产,false即表示value已消费
public int get() {
while (available == false) {// Box无数据
try {
wait();// 交出对象锁,等待生产者写入数据
} catch (InterruptedException e) {
e.printStackTrace();
}
}
available = false;// 开关变量取反,示意消费者可以取走数据
notifyAll();// 唤醒线程池中所有阻塞线程
return value;
}
public void put(int value) {
while (available == true) {// Box有数据
try {
wait();// 交出对象锁,等待消费者取走数据
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.value = value;
available = true;// 开关变量取反,示意生产者可以生产数据
notifyAll();// 唤醒线程池中所有阻塞线程
}
public void run() {
//循环,两个线程协调完成任务
while (this.value <= 5) {
//Box无数据时
if (!available) {
synchronized (this) {
if (this.value < 5) {
for (int i = 1; i < 6; i++) {
this.put(i);
System.out.println("Producer:" + "p" + " "
+ "produced:" + i);
}
}
}
//当value值为5时,跳出,不再生产数据
if(this.value==5){
return;
}
}
//Box有数据时
if (available) {
synchronized (this) {
for (int i = 1; i < 6; i++) {
System.out.println("Consumer:" + "c" + " "
+ "consumed:" + this.get());
}
}
}
}
}
}
测试类:
public class ProducerConsumerTest {
public static void main(String[] args) {
Box box=new Box();//创建要处理的资源
new Thread(box).start();//构建一个生产者线程
new Thread(box).start();//构建一个消费者线程
}
}
运行结果:
Producer:p produced:1
Consumer:c consumed:1
Producer:p produced:2
Consumer:c consumed:2
Producer:p produced:3
Consumer:c consumed:3
Producer:p produced:4
Consumer:c consumed:4
Producer:p produced:5
Consumer:c consumed:5
很明显,我们省去了生产者类和消费者类,这也体现了,对于处理同一资源对象,Runnable相对于Thread的优势.欢迎提出改正意见,达到交流共同学习的目的.
下接:java多线程入门四
http://172672421-qq-com.iteye.com/admin/blogs/1128975
分享到:
相关推荐
java多线程入门,资料中讲述了从线程的入门到精通
java多线程入门
对于线程的入门 ,对于一个java程序猿 很重要
java多线程小程序实例 java多线程小程序实例
内含 chapter02-chapter18 共 17 个实例性源码项目,内容循序渐进,由入门到精通。尤其适合于没有 Java 线程开发经验的朋友。自己动手敲出本资源解压缩后的 ...相信你理解了此源码之后,即可步入 Java 多线程开发。
必知必会的多线程入门基础知识
运用JAVA语言编辑多线程程序,初学入门教程,PPT格式,直观
1. Java多线程学习(一)Java多线程入门 2. Java多线程学习(二)synchronized关键字(1) 3. Java多线程学习(二)synchronized关键字(2) 4. Java多线程学习(三)volatile关键字 5. Java多线程学习(四)...
随着现代处理器的生产工艺从提升...《Java多线程编程实战指南(核心篇)》适合有一定Java语言基础的读者作为入门多线程编程之用,也适合有一定多线程编程经验的读者作为重新梳理知识结构以提升认知层次和参考之用。
黑马+传智 Java入门到精通视频教程+课件+代码,30套Java开发项目代码,Java多线程与并发库高级应用视频教程,及电子书,面试题,开发工具等
Java线程入门大全 详细介绍了java的多线程技术
【完整课程列表】 ... 完整版精品java课件 ...完整版精品java课件 Java基础入门教程 Java程序设计 第13章 多线程(共24页).ppt 完整版精品java课件 Java基础入门教程 Java程序设计 第14章 socket网络编程(共24页).ppt
一个java多线程的入门程序,运行开发利用j2sdk1.4.1_01,相信它会对你有一定帮助,能帮你多少那就要看你了
日本经典多线程入门书,原版长销11年! 1.图文并茂 通俗易懂 日本资-深技术作家、《程序员的数学》作者结城浩执笔,264张图表(UML类图、时序图、Timethreads图等)穿插文中,通过类比手法和浅显的语言,逐一讲解与...
适合初级程序员入门学习java的多线程机制
在使用java线程的时候,特别是初学者总会有几点很常见的误区 对JAVA入门编程人员的一点建议
01、【中级原理】java多线程并发编程入门原理精通视频教程 02、【中级原理专题】java并发编程多线程高级专题课程 03. 【中级原理】高并发编程原理和线程池精通教程 04、【高级原理】Java并发多线程编程基础原理与...
这个资料从多线程的基本概念讲起,一直到能够熟练使用多线程,看完这个后能够直接进行多线程的程序开发,资料比较全面。