回顾大学时期的java多线程学习,一直一知半解,工作后平时都是写些web前端代码,很少接触到服务器端编程,不用考虑线程安全性问题,多线程应用的可谓少之又少.
还记得当初的生产者/消费者模型吗?生产者负责生产数据,消费者负责取走数据,生产者和消费者可以看做是两个线程,他们共享一个缓冲区,这两个线程相互协调工作,生产者第一次生产数据之前,消费者不能取数据,生产者每生产一数据,便通知消费者取走该数据,消费者取走完毕后,便通知生产者可以继续生产数据,如此反复,直至完成所有读写操作.这便涉及到了多线程的同步问题.
实际生活中,我们遇到很多多线程同步的问题:QQ好友聊天;火车票销售/订购;网站服务器响应客户端等等.
我们先定义要处理的资源(Box):
public class Box {
private int value;//要进行读写的值
private boolean available = false;//开关变量,true即表示value已生产,false即表示value已消费
public synchronized int get() {
while (available == false) {//Box无数据
try {
wait();// 交出对象锁,等待生产者写入数据
} catch (InterruptedException e) {
e.printStackTrace();
}
}
available = false;//开关变量取反,示意生产者可以生产数据
notifyAll();//唤醒线程池中所有阻塞线程
return value;
}
public synchronized void put(int value) {
while (available == true) {//Box有数据
try {
wait();// 交出对象锁,等待消费者取走数据
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.value = value;
available = true;//开关变量取反,示意消费者可以取走数据
notifyAll();//唤醒线程池中所有阻塞线程
}
}
Box拥有供读写操作的value,生产者每生产(put())一数据(value),消费者便取走(get())一数据(value).
线程--生产者:
public class Producer extends Thread {
private Box box;//要处理的资源
private String name;//生产者名称
//构造器
public Producer(Box box, String name) {
this.box = box;
this.name = name;
}
public void run() {
for (int i = 1; i < 6; i++) {
box.put(i);//写入数据i(即给box中的value设定初值)
System.out.println("Producer:" + name + " " + "produced:" + i);//打印
try {
sleep((int) (Math.random() * 100));//强制睡眠,用以等待消费者取走数据
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
线程--消费者:
public class Consumer extends Thread {
private Box box;//要处理的资源
private String name;//消费者名称
//构造器
public Consumer(Box box, String name) {
this.box = box;
this.name = name;
}
public void run() {
int value = 0;
for (int i = 1; i < 6; i++) {
value = box.get();//取走数据(即获取box的value值)
System.out.println("Consumer:" + name + " " + "consumed:" + value);
try {
sleep((int) (Math.random() * 100));//强制睡眠,用以等待生产者生产数据
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
给生产者和消费者都提供了一个Box属性,是因为他们处理的是同一资源Box,所以我们先new一个Box实例,然后分别对其进行操作:
测试类:
public class ProducerConsumerTest {
public static void main(String[] args) {
Box box=new Box();//创建要处理的资源
Producer p=new Producer(box,"p");//构建一个生产者线程
Consumer c=new Consumer(box,"c");//构建一个消费者线程
p.start();//启动生产者线程
c.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
下接:java多线程入门二
http://172672421-qq-com.iteye.com/admin/blogs/1128876
分享到:
相关推荐
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多线程的入门程序,运行开发利用j2sdk1.4.1_01,相信它会对你有一定帮助,能帮你多少那就要看你了
Java线程入门大全 详细介绍了java的多线程技术
【完整课程列表】 ... 完整版精品java课件 ...完整版精品java课件 Java基础入门教程 Java程序设计 第13章 多线程(共24页).ppt 完整版精品java课件 Java基础入门教程 Java程序设计 第14章 socket网络编程(共24页).ppt
日本经典多线程入门书,原版长销11年! 1.图文并茂 通俗易懂 日本资-深技术作家、《程序员的数学》作者结城浩执笔,264张图表(UML类图、时序图、Timethreads图等)穿插文中,通过类比手法和浅显的语言,逐一讲解与...
适合初级程序员入门学习java的多线程机制
在使用java线程的时候,特别是初学者总会有几点很常见的误区 对JAVA入门编程人员的一点建议
【完整课程列表】 完整版 Java编程基础入门教程 ...完整版 Java编程基础入门教程 Java语言程序设计 第8章_多线程与异常处理(共72页).ppt 完整版 Java编程基础入门教程 Java语言程序设计 第9章_Applet(共40页).ppt
第10章 JAVA多线程入门我们要学习多线程,就不可避免的需要学习一些计算机组成的一些知识,特别是cpu和内存相关的一些知识,我用一张简单的图来描述目前的计算机