package cn.wtu.executor;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
/**
* *版本2...
* 使用新版本的并发库改写生产者消费者
* 可以支持取消的版本
* @author JZY 2010-12-7
*/
public class ProducerAndConsumer1 {
static ExecutorService executorService = Executors.newFixedThreadPool(4);
//ExecutorService增强了Executor接口,加入了一些生命周期(liife cycle)的支持
//让线程的关闭更容易
public static void main(String[] args) {
BlockingQueue<Food> container= new LinkedBlockingQueue<Food>();
Producer producer = new Producer(container);
Consumer consumer = new Consumer(container);
Future producerFuture = executorService.submit(producer);//封装成future对象
//增强了一些方法
Future consumerFuture = executorService.submit(consumer);
while(!producerFuture.isDone()||!consumerFuture.isDone()) {
}
//完成任务后 关闭线程池
executorService.shutdown();
System.out.println("退出程序.......");
}
}
这些日在在学校无所事事,突然发现了一本好书<<Java并发编程实践>>,作者都是牛人啊...Joshua Bloch jdk CollectionFrameWork缔造者....DougLea教授,jdk并发库的缔造者...Brian Goetz IBM Java社区的大牛..等等
额。。这本书真的很好,虽然我现在的水平很多看不懂,理解的不深刻,但一定会努力的学习..不断温故,相信以后工作在大量的时间后会慢慢有所体会..
先发个自己的入门。。。
package cn.wtu.executor;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
/**
* Doug Lea 教授...Joshua Bloch大神 Brian Goetz 哥..
* 使用新版本的并发库改写生产者消费者
* Executor框架的提出 解耦了任务的提出与任务的执行
* FixedThreadPool内部也内置了一个BlockingQueue private final BlockingQueue<Runnable>
* workQueue; 用于存储提交给她的任务
*
* @author JZY 2010-12-7
*/
public class ProducerAndConsumer {
static Executor executor = Executors.newFixedThreadPool(4);
public static void main(String[] args) {
BlockingQueue<Food> container = new LinkedBlockingQueue<Food>();
Producer producer = new Producer(container);
Consumer consumer = new Consumer(container);
executor.execute(producer);
executor.execute(consumer);
}
}
class Producer implements Runnable {
// 生产的food将放入这个容器中
// blockingqueue自己实现了阻塞当你调用get时如果容器为空为阻塞,这样我们就不必在客户端
// 自己控制
BlockingQueue<Food> container;
public Producer(BlockingQueue<Food> container) {
this.container = container;
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
Food food = produceFood(i);
// container.add(food); //额 ...add方法是不支持阻塞的...
try {
container.put(food);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// System.out.println("生产"+food); 放在这里就是bug
}
}
private Food produceFood(int i) {
Food food = new Food(i + 1, "食物" + (i + 1));
System.out.println("生产" + food);// 放在这里是不合适的,有提前
// 最好放在put方法的内部 真正的加入容器之后
return food;
}
}
class Consumer implements Runnable {
BlockingQueue<Food> container;
public Consumer(BlockingQueue<Food> container) {
this.container = container;
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
consumeFood();
}
}
private void consumeFood() {
Food food;
try {
food = container.take();// Retrieves and removes the head of this
// queue,
// waiting if necessary until an element becomes available
System.out.println("消费" + food);// 会存在延迟
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Food {
Integer id;
String desccibtion;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Override
public String toString() {
return "Food [id=" + id + ", desccibtion=" + desccibtion + "]";
}
public Food(Integer id, String desccibtion) {
this.id = id;
this.desccibtion = desccibtion;
}
public String getDesccibtion() {
return desccibtion;
}
public void setDesccibtion(String desccibtion) {
this.desccibtion = desccibtion;
}
}
分享到:
相关推荐
在并发编程部分,笔记会介绍线程的创建和管理,同步机制如synchronized关键字和Lock接口,以及并发工具类如ExecutorService、Semaphore和CountDownLatch。了解这些内容能帮助你在多核环境下编写高效的程序。 对于...
Java是一种广泛使用的面向对象的编程语言,以其跨平台性、高效性和丰富的类库而...通过阅读并实践这些笔记,初学者不仅可以掌握Java编程,还能培养良好的编程习惯和思维方式,为日后的深入学习和开发工作打下坚实基础。
线程是并发编程的基础,学习如何创建和管理线程,理解同步和互斥的概念,能够让你写出高效的并发程序。 孙鑫老师的书中还会讲解IO流和NIO(非阻塞I/O)系统,这对于读写文件和网络通信至关重要。反射机制允许程序在...
线程是并发编程的基础,笔记会介绍线程的创建方式,如实现Runnable接口和继承Thread类,以及线程同步和互斥的手段,如synchronized关键字和wait()、notify()方法。 最后,笔记可能包含一些Java标准库的常用类和方法...
Java并发编程是一个重要的主题,特别是在高并发应用中,如服务器端和大数据处理。JUC,全称为Java Util Concurrent,是Java平台提供的一组用于构建高效并发应用的高级API。这个包包含了各种工具类,帮助开发者处理多...
总的来说,这份【JAVA入门实例代码及学习笔记】是全面掌握JAVA SE开发的宝贵资源,不仅有理论知识的讲解,还有实践代码的示例,对于初学者来说,是快速提升技能的理想材料。通过阅读和实践这些内容,你将能够逐步...
6. **多线程**:Java提供了并发编程的支持,包括线程的创建、同步、互斥等。学习Thread类和Runnable接口,以及synchronized关键字、wait()、notify()和notifyAll()方法的使用。 7. **网络编程**:Java的Socket编程...
以上只是《韩顺平java从入门到精通1-32课源码笔记》中的部分核心知识点,实际上,这份资料可能还包含了更多高级主题,如并发编程、Java EE(企业级应用)、框架技术等。通过系统学习和实践,可以逐步成为一名熟练的...
【JAVA零基础入门教程笔记】 本教程是针对Java编程语言的初学者精心设计的,旨在帮助没有编程背景的学员快速掌握Java基础知识。任小龙的JAVA教程在网易公开课上提供了丰富的教学资源,配合这些笔记和源代码,学习者...
同时,学习Java的并发编程,包括线程、同步机制(synchronized关键字和Lock接口)以及并发集合(如ConcurrentHashMap),能帮助你编写出多线程环境下的高效程序。 最后,Java的异常处理、垃圾回收机制以及内存管理...
"达内教育 Java从入门到高级全套课堂笔记"涵盖了从基础到高级的全面Java学习资源,旨在帮助初学者逐步掌握这门强大的编程语言。 首先,让我们从Java的基础开始。Java是一种面向对象的语言,它的设计哲学是“一次...
Java JDK 6学习笔记是为Java初学者量身定制的一份宝贵资料,它涵盖了Java编程的基础概念、语法以及...通过详细阅读和反复实践,初学者可以逐步提高编程技能,理解Java编程的核心思想,从而在软件开发的世界里游刃有余。
Java并发编程.pdf JAVA核心知识点整理.pdf Java高级架构知识点整理.pdf Java高级架构面试知识点整理.pdf JVM与性能优化知识点整理.pdf MySQL性能调优与架构设计解析文档.pdf Nginx入门到实战.pdf springCloud笔记....
此外,笔记可能还会包含一些高级主题,如设计模式、并发编程、网络编程、数据库操作(JDBC)等。这些内容将帮助读者深入理解Java编程的精髓,提升实际项目开发的能力。 李兴华老师的教学风格通常注重实践与理论的...
总的来说,这份"Java网络编程教材"涵盖了广泛的Java网络编程知识,包括但不限于基础概念、API用法、协议解析、并发编程等。对于想要深入理解Java网络编程的初学者来说,这是一个非常宝贵的资源,通过系统学习和实践...
李兴华老师是魔乐科技(MLDN)的知名讲师,他的Java培训课程深受学员好评,这些课堂笔记将涵盖Java编程的基础到高级概念。 1. **环境搭建**:首先,学习Java需要安装Java Development Kit (JDK),并配置好环境变量...
Java是一种广泛使用的面向对象的编程语言,以其跨平台、开源和强大的功能而闻名。这份"JAVA基础笔记"涵盖了从入门到进阶的关键知识点,对于...通过深入阅读并实践其中的示例,初学者可以逐步建立起扎实的Java编程基础。